黑马程序员技术交流社区
标题:
反射---通过反射获取变量的值
[打印本页]
作者:
王飞
时间:
2012-7-15 18:59
标题:
反射---通过反射获取变量的值
import java.lang.reflect.Field;
public class DuotaiDemo {
public static void main(String[] args) throws Exception{
/*获取字节码的三种方式:
1.类名.class
2.对象名.getclass
3.Class.forName(className);
*/
//通过反射获取Person对象的变量值
Person p1 = new Person(10,20);
Field field1 = p1.getClass().getDeclaredField("x");//返回的是Person类中的字节码上变量y,
//通过field1对象获取Person的值
System.out.println(field1.get(p1));//用field对象获取相对应--对象--的值
//程序是上面这句话报的错:java.lang.IllegalAccessException这是什么东东????
// 求帅哥赐教啊
Field field2 = p1.getClass().getDeclaredField("y"); //获取y值?
System.out.println(field2.get(p1));
}
}
class Person
{
private int x ;
private int y ;
public Person(int x, int y)
{
super();
this.x = x;
this.y = y;
}
public static void method_1()
{
System.out.println("hha");
}
}
作者:
丁二跃
时间:
2012-7-15 19:11
x 是私有的
Field field1 = p1.getClass().getDeclaredField("x"); 这个只是可以看到 x 但是不能操作
再加上 field1.setAccessible(true) 就可以进行读写了
不只成员变量如此 私有 成员方法 构造器 都可以这样操作
作者:
陆强强
时间:
2012-7-15 19:15
Field field1 = p1.getClass().getDeclaredField("x");
field1.setAccessible(true);//私有变量不能在另一类里调用,所以只能用暴力反射,强制执行
//通过field1对象获取Person的值
System.out.println(field1.get(p1));
Field field2 = p1.getClass().getDeclaredField("y");
field2.setAccessible(true);
System.out.println(field2.get(p1));
作者:
程潇
时间:
2012-7-16 21:04
这个问题考察的是反射中的成员变量的反射。
成员变量反射的应用主要要两层:
1.变量的获取
2.变量的访问
成员变量存在于类中,因此也要遵循java的访问控制规则,分为public、default、protected和private
在成员变量反射的应用中,一般只要确定能否访问即可
示例代码:
Person p1 = new Person(10,20);
假设x是public的,y是private的
对于有访问权限的,应用如下:
Field fieldX = p1.getClass().getField("x");
System.out.println(fieldY.get(p1));
对于没有访问权限的,应用如下:
Field fieldX = p1.getClass().
getDeclaredField("x")
;
fieldX.setAccessible(true); //这个叫暴力反射
System.out.println(fieldX.get(p1));
对于本例的问题,x和y都是private的,无访问权限,若要访问x和y,将用以上第二种暴力反射方式
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2