A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© kira 中级黑马   /  2014-2-22 16:34  /  870 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 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
没有这个字段 这是为什么





评分

参与人数 1技术分 +1 收起 理由
何伟超 + 1

查看全部评分

4 个回复

倒序浏览
y是private的,你把它改为public 的或者用暴力访问private的。。

评分

参与人数 1技术分 +1 收起 理由
何伟超 + 1

查看全部评分

回复 使用道具 举报
淡夜清风 发表于 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. }
复制代码




回复 使用道具 举报
private 修饰的 要暴力反射 获取字段方法用这个getDeclaredField()  
还有在打印语句前面加上fy.setAccessible(true);

评分

参与人数 1技术分 +1 收起 理由
何伟超 + 1

查看全部评分

回复 使用道具 举报
ixiangfeng 发表于 2014-2-22 16:49
private 修饰的 要暴力反射 获取字段方法用这个getDeclaredField()  
还有在打印语句前面加上fy.setAcces ...

OK 是这问题 多谢大神 解决了
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马