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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

提示: 作者被禁止或删除 内容自动屏蔽

7 个回复

倒序浏览
黑马网友  发表于 2011-7-15 10:48:02
沙发
这个程序本身没有任何语法问题,但如果你的目标是读取取成员变量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]

评分

参与人数 1技术分 +2 收起 理由
admin + 2 有点小问题,但总体不错!!

查看全部评分

回复 使用道具 举报
黑马网友  发表于 2011-7-15 10:53:25
藤椅
好像不对吧,我运行了一下,一点反应都没有
回复 使用道具 举报
2楼说得没错,上面程序中反射类中所有属性时应该调用getDeclaredFields()方法。
补充2楼如果用fields.setAccessible方法的话要置为true才有权限进行set。
[ 本帖最后由 周玮池 于 2011-07-15  11:22 编辑 ]
回复 使用道具 举报
黑马网友  发表于 2011-7-15 13:59:40
报纸
1、forName()方法出传入的参数必须是fm类完整的限定名,如net.csdn.reflect.fm
2、getFields()方法返回的是所有可访问的[color=Red]公共[/color]字段,fm类中a、b都没有设置成public,所以只能使用getDeclaredFields()返回类中所有字段。

评分

参与人数 1技术分 +1 收起 理由
admin + 1 没错!!!!

查看全部评分

回复 使用道具 举报
黑马网友  发表于 2011-7-16 10:39:00
地板
通过Class对象的getFields()方法可获取此Class对象所对应的实体
的所有public字段(成员变量)如果要获取所有的字段,可使用getDeclaredFields()方法

评分

参与人数 1技术分 +1 收起 理由
admin + 1 答对了!!

查看全部评分

回复 使用道具 举报
黑马网友  发表于 2011-7-16 11:37:28
7#
1,getFileds()返回一个包含了Field对象的数组,这些对象记录了这个类或者其超类的[b]公有[/b]域
getDeclaredField()返回的数组记录了这个类的全部域,如果类中没有域,或者Class对象描述的是基本类型或者数组类型,这些方法都返回0

2,访问私有属性需要用到AccessibleObject(Constructor,Method,Field都是现在这个接口)的两个方法
void  setAccessible(boolean flag)或者用他的静态方法
AccessibleObject,setAccessible(AccessibleObject [] array,boolean flag)把整个数组都设置成可访问的

评分

参与人数 1技术分 +1 收起 理由
admin + 1

查看全部评分

回复 使用道具 举报
王光保 黑马帝 2011-7-16 18:19:47
8#
类名应该大写!!!!

评分

参与人数 1技术分 +1 收起 理由
admin + 1 你是相当的有才!!!

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马