package tmp;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
public class Test {
public static void main(String[] args) throws NoSuchFieldException, SecurityException, IllegalArgumentException, IllegalAccessException, NoSuchMethodException, InvocationTargetException{
Student x=new Student();
Class<?> xC=x.getClass();
System.out.println("x类的名字:"+xC.getName()+"; 路径:"+xC.getPackage()+"; 父类:"+xC.getSuperclass());
Field id=xC.getDeclaredField("id");
id.setAccessible(true);
id.setInt(x, 100);
System.out.println("利用反射机制,改变私有域成员变量值,赋id值为:"+x.get_id());
Method set_id=xC.getDeclaredMethod("set_id",int.class);
set_id.invoke(x, 10);
System.out.println("利用反射机制,获取成员方法,赋id的值为:"+x.get_id());
}
}
class Student extends Student0{
private int id;
public Student(){
}
public int get_id(){
return id;
}
public void set_id(int id){
this.id=id;
}
public void set_id(float id){
this.id=(int)id;
}
}
class Student0{
private int id;
public Student0(){
}
public int get_id(){
return id;
}
public void set_id(float id){
this.id=(int)id;
}
}
程序运行结果:
x类的名字:tmp.Student; 路径:package tmp; 父类:class tmp.Student0
利用反射机制,改变私有域成员变量值,赋id值为:100
利用反射机制,获取成员方法,赋id的值为:10
知识点:
1、如何改变类中私有域变量值:
Class<?> xC=x.getClass();
Field id=xC.getDeclaredField("id");
id.setAccessible(true);
id.setInt(x, 100);
2、如何利用java反射机制调研类的方法:
<pre name="code" class="java">Class<?> xC=x.getClass();
<pre name="code" class="java">Method set_id=xC.getDeclaredMethod("set_id",int.class);
set_id.invoke(x, 10);