黑马程序员技术交流社区

标题: 反射问题 [打印本页]

作者: hanrongle    时间: 2013-8-18 12:09
标题: 反射问题
  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. }
复制代码

作者: 神之梦    时间: 2013-8-18 13:40
你用getFields()只能获取public修饰的成员变量,很显然你的fm类中的变量没有被public修饰,所以fields.length的值就是0,自然就啥也没有了
作者: 静以修身    时间: 2013-8-18 13:56
没有输出结果很大的可能性事因为对你写的类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);
}
作者: 胡智    时间: 2013-8-18 14:18
你查一下API就知道了:
getFields()方法返回的是公共类型的成员变量。
如果你想返回非public修饰的变量,要用getDeclaredFields()方法获取变量。
如果想取得变量被private修饰了,还需要加上setAccessible(true)方法,让其可见,才能进行打印操作。
作者: 许云龙    时间: 2013-8-18 15:07

  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. }
复制代码

作者: 杨增坤    时间: 2013-8-19 23:07
public Field[] getDeclaredFields()可以用这个方法,获得所有成员!public Field[] getFields()获得公有成员你可以查看API就明白了!


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

n.png

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

2.png

作者: 杨增坤    时间: 2013-8-21 08:00
如果问题解决了,请把问题更改为已解决!
谢谢合作!




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