黑马程序员技术交流社区

标题: 关于java反射的问题? 我想提取某个类的几个成员变量,这样写对吗? [打印本页]

作者: 技术测试刘老师    时间: 2011-7-15 09:13
标题: 关于java反射的问题? 我想提取某个类的几个成员变量,这样写对吗?
代码如下:[code=java]import java.lang.*;
import java.util.*;
import java.lang.reflect.*;
import java.awt.*;
class test
{
public static void main(String[] args)
{
try
{
Class newfm=Class.forName("fm");
Field fields[]=newfm.getFields();
for(int i=0;i<fields.length;i++)
System.out.println(fields.getName());
}
catch(Exception e)
{
System.out.println(e.toString());
}
}
}

class fm
{
int a=10;
int b=20;
Point p=new Point(1,2);

}[/code]
作者: 匿名    时间: 2011-7-15 10:48
这个程序本身没有任何语法问题,但如果你的目标是读取取成员变量a,b,p的话,写法是不对的。
因为这里的 a,b ,p 是private的,所以上面的代码是读取不到的。要修改有两个方法
一是,修改class fm[code=java]class fm
{ public int a=10;
  public int b=20;
  public point p=new point(1,2
)[/code]另一种方法是:[code=java]import java.lang.*;
import java.util.*;
import java.lang.reflect.*;
import java.awt.*;
class test
{
public static void main(String[] args)
{
try
{
Class newfm=Class.forName("fm");
//Field fields[]=newfm.getFields();
Field fields[]=newfm.getDeclaredFields();//用这一句读取私有成员变量,
for(int i=0;i<fields.length;i++)
System.out.println(fields[i].getName());
//但是假设你需要Set某个私有成员变量时,需要提升权限先。
//fields[i].setAccessible()
//然后才能用,set
}
catch(Exception e)
{
System.out.println(e.toString());
}
}
}

class fm
{
int a=10;
int b=20;
Point p=new Point(1,2);

}[/code]
作者: 匿名    时间: 2011-7-15 10:53
好像不对吧,我运行了一下,一点反应都没有
作者: 周玮池    时间: 2011-7-15 11:15
2楼说得没错,上面程序中反射类中所有属性时应该调用getDeclaredFields()方法。
补充2楼如果用fields.setAccessible方法的话要置为true才有权限进行set。
[ 本帖最后由 周玮池 于 2011-07-15  11:22 编辑 ]
作者: 匿名    时间: 2011-7-15 13:59
1、forName()方法出传入的参数必须是fm类完整的限定名,如net.csdn.reflect.fm
2、getFields()方法返回的是所有可访问的[color=Red]公共[/color]字段,fm类中a、b都没有设置成public,所以只能使用getDeclaredFields()返回类中所有字段。
作者: 匿名    时间: 2011-7-16 10:39
通过Class对象的getFields()方法可获取此Class对象所对应的实体
的所有public字段(成员变量)如果要获取所有的字段,可使用getDeclaredFields()方法
作者: 匿名    时间: 2011-7-16 11:37
1,getFileds()返回一个包含了Field对象的数组,这些对象记录了这个类或者其超类的[b]公有[/b]域
getDeclaredField()返回的数组记录了这个类的全部域,如果类中没有域,或者Class对象描述的是基本类型或者数组类型,这些方法都返回0

2,访问私有属性需要用到AccessibleObject(Constructor,Method,Field都是现在这个接口)的两个方法
void  setAccessible(boolean flag)或者用他的静态方法
AccessibleObject,setAccessible(AccessibleObject [] array,boolean flag)把整个数组都设置成可访问的
作者: 王光保    时间: 2011-7-16 18:19
类名应该大写!!!!




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