本帖最后由 孙涛00 于 2013-10-27 19:19 编辑
- public class ReflectPoint {
- private int x;
- public int y;
- public ReflectPoint(int x, int y) {
- this.x = x;
- this.y = y;
- }
-
- }
复制代码- import java.lang.reflect.Field;
- public class ReflectTest {
- /**
- * @param args
- * @throws NoSuchFieldException
- * @throws SecurityException
- */
- public static void main(String[] args) throws Exception, NoSuchFieldException {
- // TODO Auto-generated method stub
- ReflectPoint rPoint1 = new ReflectPoint(3, 5);//ReflectPoint对象1
- ReflectPoint rPoint2 = new ReflectPoint(4, 6);//ReflectPoint对象2
-
- //通过rPoint1得到的fieldX,FieldY
- Field fieldY = rPoint1.getClass().getField("y");//根据变量名获得Field对象,用它去获取ReflectPoint类对象的y值
- Field fieldX = rPoint1.getClass().getDeclaredField("x");//x为私有,发现所有能发现的成员,包括私有成员
- fieldX.setAccessible(true);//设置 获取此对象的accessible的标志值为true,暴力反射
-
- //rPoint1
- System.out.println(fieldX.get(rPoint1));//结果3
- System.out.println(fieldY.get(rPoint1));//结果5
- //rPoint2
- System.out.println(fieldX.get(rPoint2));//结果4
- System.out.println(fieldY.get(rPoint2));//结果6
-
- System.out.println(rPoint1.getClass()==rPoint2.getClass());//true
- System.out.println(rPoint1.getClass().getField("y")==rPoint2.getClass().getField("y"));//false
-
- }
- }
复制代码 运行结果:
3
5
4
6
true
false
结果为什么是这样?为什么最后一个是false,而不是true?
System.out.println(rPoint1.getClass()==rPoint2.getClass());结果为true,说明用rPoint1和rPoint2得到是同一个ReflectPoint类的Class,但是
System.out.println(rPoint1.getClass().getField("y")==rPoint2.getClass().getField("y"));结果是false;说明通过同一个ReflectPoint类的Class,获取的rPoint1和rPoint2的Field对象不是同一个。
为什么?
张孝祥老师说过这里的FieldY不是对象本身上的变量,是类上的,要用它去取某个对象的值,那是不是可以说他能获取ReflectPoint的所有对象的y值,正好
//rPoint2
System.out.println(fieldX.get(rPoint2));//结果4
System.out.println(fieldY.get(rPoint2));//结果6
通过rPoint1得到的fieldX,FieldY能够得到rPoint2的x,y的值。不知道我这样理解对不对,但还是有上述为什么会得到false的疑问。 |