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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© hanrongle 中级黑马   /  2013-8-18 12:09  /  1398 人查看  /  6 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

  1. 想提取 fm 类的成员变量 不知道这样写对不对, 没有输出结果,咋回事?
  2. import java.lang.*;
  3. import java.util.*;
  4. import java.lang.reflect.*;
  5. import java.awt.*;
  6. class test
  7. {
  8. public static void main(String[] args)
  9. {
  10. try
  11. {
  12. Class newfm=Class.forName("fm");
  13. Field fields[]=newfm.getFields();
  14. for(int i=0;i<fields.length;i++)
  15. System.out.println(fields[i].getName());
  16. }
  17. catch(Exception e)
  18. {
  19. System.out.println(e.toString());
  20. }
  21. }
  22. }

  23. class fm
  24. {
  25. int a=10;
  26. int b=20;
  27. Panel g=new Panel();
  28. }
复制代码

评分

参与人数 1技术分 +1 收起 理由
张智文 + 1

查看全部评分

6 个回复

倒序浏览
你用getFields()只能获取public修饰的成员变量,很显然你的fm类中的变量没有被public修饰,所以fields.length的值就是0,自然就啥也没有了
回复 使用道具 举报
没有输出结果很大的可能性事因为对你写的类fm和类的成员变量的属性的访问权限不够,要强制提权才行,或者你用public修饰试下。要么你就在输出之前修改访问控制权限,因为如果你的类的属性是private或者protected修饰的,可能要强制获取访问权才行。
try
{
Class newfm=Class.forName("fm");
Field fields[]=newfm.getFields();
for(int i=0;i<fields.length;i++)
// 获取原来的访问控制权限
boolean accessFlag = fields[i].isAccessible();
// 修改访问控制权限
fields[i].setAccessible(true);
// 获取在对象f中属性fields[i]对应的对象中的变量
System.out.println(fields[i].getName());
// 恢复访问控制权限
fields[i].setAccessible(accessFlag);
}
回复 使用道具 举报
你查一下API就知道了:
getFields()方法返回的是公共类型的成员变量。
如果你想返回非public修饰的变量,要用getDeclaredFields()方法获取变量。
如果想取得变量被private修饰了,还需要加上setAccessible(true)方法,让其可见,才能进行打印操作。
回复 使用道具 举报

  1. /*
  2. * fm 对象中有什么成员变量是你知道的情况下才可以用暴力反射获取方法,
  3. * 否则无法获取非publi修饰的成员变量,通过getDeclaredField("b")方法获取成员变量
  4. * 如果想调用这样的成员变量,还必须调用一下setAccessible(true)(人称暴力反射)
  5. *
  6. * getFields()方法只能获取类中所有的公共成员字段
  7. *
  8. * */
  9. import java.awt.Panel;
  10. import java.lang.reflect.Field;
  11. class classIs
  12. {
  13.         public static void main(String[] args)
  14.         {
  15.                 try
  16.                 {
  17.                         Class newfm=Class.forName("fm");
  18.                         
  19.                         //这里是获取类中非公工的成员变量
  20.                         Field field = newfm.getDeclaredField("b");
  21.                         System.out.println(field.getName());
  22.                         
  23.                         //以下是你的代码
  24.                         Field fields[]=newfm.getFields();
  25.                         for(int i=0;i<fields.length;i++){
  26.                                 
  27.                                 System.out.println(fields[i].getName());
  28.                         }
  29.                 }
  30.                 catch(Exception e)
  31.                 {
  32.                         System.out.println(e.toString());
  33.                 }
  34.                
  35.         }
  36. }

  37. class fm
  38. {
  39.         public int a=10; //这里我添加的public修饰
  40.         int b=20;
  41.         public Panel g=new Panel();//这里添加的public修饰
  42. }
复制代码

评分

参与人数 1技术分 +1 收起 理由
田磊阳 + 1

查看全部评分

回复 使用道具 举报
public Field[] getDeclaredFields()可以用这个方法,获得所有成员!public Field[] getFields()获得公有成员你可以查看API就明白了!


n.png (3.14 KB, 下载次数: 20)

n.png

2.png (3.07 KB, 下载次数: 16)

2.png
回复 使用道具 举报
如果问题解决了,请把问题更改为已解决!
谢谢合作!
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马