一般认为程序中类中如果定义了private成员变量或者private的成员函数,我们创建的对象是不能访问他们的,并且不能改变他们的值,但是在Java中还是可以利用反射的机制来改变private或public里面的值,例子如下:
//定义一个学生类
public class Students{
private int id;
private String name;
public String getName() {
return this.name;
}
public int getId() {
return this.id;
}
private void setName(String name) {
this.name = name;
}
}
在上面的代码中我们会认为setName是不能够访问的,所以无法设置name属性的值,但是我们还是可以用下面的方法来改变name的属性;如下:
public Test {
public static void main(String[] args) {
Students st = new Students();
// 获得对应的方法
Method set = Students.getDeclareMethod("setName", java.lang.String.class); // 两个变量含义:1,表示要获得的方法的名称 2,表示传入变量的类型,如果有多个变量可以在后面继续写
set.setAccessible(true); // 如果方法是private型的,必须要设置为true,如果是public则可以不设
set.invoke(st, "王伟"); // 设置成功
/* 上面是设置成员方法的,下面可以设置成员变量 **/
Class cl = st.getClass();
Field id = cl.getDeclareField("id");
id.setAccessible(true);
id.setInt(st, 10); // 思路跟上面一致
}
}
当然我可以通过一些类的反射方法,来获得这个类的一些定义,如下:
Class类的常用方法:
getAnnotations 返回class对象上存在的注释
getCanonicalName 返回class中定义的底层类的规范化名称
getGenericInterfaces 返回泛型式对象类所有实现的接口
getGenericSuperclass 返回泛型式对象类所有直接继承的超类
getModifiers 返回此类或接口的修饰符
getTypeParameters 按声明顺序返回TypeVariable对象的一个数组
getConstructors 返回所有构造方法组成的数组
getDeclaredFields 返回所有非继承域组成的数组
getDeclaredMethods 返回所有非继承方法组成的数组