黑马程序员技术交流社区

标题: 关于反射这块有个问题 大神来看下 [打印本页]

作者: kira    时间: 2014-2-22 16:34
标题: 关于反射这块有个问题 大神来看下
本帖最后由 kira 于 2014-2-22 16:36 编辑

需求是 得到一个字段 用反射的方法取出这个值
我是这么写的
  1. import java.lang.reflect.Constructor;
  2. import java.lang.reflect.Field;
  3. import java.lang.reflect.InvocationTargetException;



  4. public class ConDemo {

  5.        
  6.         public static void main(String[] args) throws SecurityException, NoSuchFieldException, IllegalArgumentException, IllegalAccessException  {
  7.                 // TODO Auto-generated method stub
  8.              
  9.           Reflectpo rp = new Reflectpo(3,5);
  10.           //得到一个字段 必须要得到这个类的字节码 rp.getClass()
  11.           Field fy = rp.getClass().getField("y");
  12.           //这里的fy不代表一个具体的值 只代表一个变量
  13.           System.out.println(fy.get(rp));
  14.         }

  15. }
  16. class Reflectpo{//创建一个类
  17.         private int x,y;
  18.         Reflectpo(int x ,int y){
  19.         super();
  20.                 this.x=x;
  21.                 this.y=y;
  22.                
  23.         }
  24.        
  25. }
复制代码


结果却抛出
Exception in thread "main" java.lang.NoSuchFieldException: y
没有这个字段 这是为什么






作者: 淡夜清风    时间: 2014-2-22 16:43
y是private的,你把它改为public 的或者用暴力访问private的。。
作者: kira    时间: 2014-2-22 16:48
淡夜清风 发表于 2014-2-22 16:43
y是private的,你把它改为public 的或者用暴力访问private的。。

忘了这茬了 权限问题
我加上暴力反射果然可以了 多谢大神
  1. import java.lang.reflect.Constructor;
  2. import java.lang.reflect.Field;
  3. import java.lang.reflect.InvocationTargetException;



  4. public class ConDemo {


  5. public static void main(String[] args) throws SecurityException, NoSuchFieldException, IllegalArgumentException, IllegalAccessException {
  6. // TODO Auto-generated method stub

  7. Reflectpo rp = new Reflectpo(3,5);
  8. //得到一个字段 必须要得到这个类的字节码 rp.getClass()
  9. Field fy = rp.getClass().getDeclaredField("y");//先可见
  10. //这里的fy不代表一个具体的值 只代表一个变量
  11. fy.setAccessible(true);//再暴力反射
  12. System.out.println(fy.get(rp));
  13. }

  14. }
  15. class Reflectpo{//创建一个类
  16. private int x,y;
  17. Reflectpo(int x ,int y){
  18. super();
  19. this.x=x;
  20. this.y=y;

  21.   }

  22. }
复制代码





作者: ixiangfeng    时间: 2014-2-22 16:49
private 修饰的 要暴力反射 获取字段方法用这个getDeclaredField()  
还有在打印语句前面加上fy.setAccessible(true);
作者: kira    时间: 2014-2-22 16:50
ixiangfeng 发表于 2014-2-22 16:49
private 修饰的 要暴力反射 获取字段方法用这个getDeclaredField()  
还有在打印语句前面加上fy.setAcces ...

OK 是这问题 多谢大神 解决了




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2