marți, 6 aprilie 2010

Java Reflection

Clasa de test Clasa


public class Clasa {
private int a;
Clasa(int val){
a=val;
}
Clasa(){
a=100;
}
public int getA(){
return a;
}
public void setA(int val){
a=val;
}
public void setA(int[] val){
a=val[0]+val[1];
}
public void setA(int a,int b){
this.a=a+b;
}
public void setA(String[] ab){
a=Integer.parseInt(ab[0])+Integer.parseInt(ab[1]);
}
}


Clasa Reflectie

import java.lang.reflect.Method;


public class Reflectie {
public int incrementProperty(String name, Object obj) throws Exception{
String prop = Character.toUpperCase(name.charAt(0)) +
name.substring(1);
String mname = "get" + prop;
//apel get
Class[] types = new Class[] {};
Method method = obj.getClass().getMethod(mname, types);
Object result = method.invoke(obj, new Object[0]);
int value = ((Integer)result).intValue() + 1;

//... si mult mai interesantul apel de set
mname = "set" + prop;
int[] p=new int[2];
p[0]=12;
p[1]=21;
int abc=12;
types = new Class[] { int.class};
method = obj.getClass().getMethod(mname, types);
method.invoke(obj,abc);
return value;
}
}


Clasa Main


public class Main {
public static void main(String[] args) throws Exception{
Clasa clasa=new Clasa((int)(Math.random()*100));
Reflectie ref=new Reflectie();
System.out.println("Inainte de reflexie: "+clasa.getA());
ref.incrementProperty("a", clasa);
System.out.println("Dupa reflexie: "+clasa.getA());

}
}


Reflectia: IBM, Java Sun, Java2S
Tehnica utila in cazul inspectarii si modificarii unui obiect in timp real, in runtime.
Prin folosirea: types = new Class[] { int.class}; se specifica ce metoda ar trebui cautata, apoi se obtine metoda method = obj.getClass().getMethod(mname, types); si in final se va apela method.invoke(obj,abc);