反射的问题 java.lang.IllegalAccessException。。。。。。。with modifiers "private"

wgj830823 2010-05-11 04:38:00
java.lang.IllegalAccessException: Class A can not access a member of class B with modifiers "private"


错误如上


在如下代码

Field[] flds = M.getClass().getDeclaredFields();
if(flds != null){
for(int m = 0; m < flds.length; m++){
Field fieldCase = flds[m];
fieldCase.getName();
if(fieldCase.getType().getName().equals("java.lang.String") && fieldCase.get(args[i]) != null && fieldCase.getModifiers() == Member.PUBLIC){
fieldCase.setAccessible(true);
fieldCase.set(args[i],
(fieldCase.get(args[i]).toString()).Trim());

}
}
}



(fieldCase.get(args[i]).toString()).Trim()这里是我要进行的操作,暂时用trim替代

问题可能是我取得的M 对象在定义的时候是定义成private的,

反射接触不多,麻烦大家详细解释一下如何处理才能允许我在这里可以编辑,M的Fields 。

谢谢
...全文
1743 23 打赏 收藏 转发到动态 举报
写回复
用AI写文章
23 条回复
切换为时间正序
请发表友善的回复…
发表回复
wgj830823 2010-05-13
  • 打赏
  • 举报
回复
[Quote=引用 20 楼 humanity 的回复:]
Java 反射出错时我们常碰到 2 种情况。

可能性,代理之类的类的类名打印出来看看一下,如果是类似 CGLib 这种代理直接继承的话,反射是正常的,而用 Proxy 这种代理不知道是不是相同,这个我没接触过,可以去用 Spring 的带 interface 支持的 AOP 测试一下。

另外一种情况:当我们的一个类有内部类做委托时也可能出现错,而这时它说的 类 B 其实不是你当时所说的……
[/Quote]
多谢您的回复,其实 你说的这些我又点看不懂。。。。 狂汗
代理应该是java的动态代理 proxy的,用spring 的带interface测试一下?测试什么呢
这里没有用到内部类
wgj830823 2010-05-13
  • 打赏
  • 举报
回复
[Quote=引用 19 楼 javaandcobol 的回复:]
1.可能你调用的那个方法不能访问私有变量,还有个方法可以访问所有变量的,你去找找看。

2.flds、flds1、flds2三个数组中的值是不同的,而且Member.PUBLIC和Member.DECLARED得值是不等的,public int max=100;public static int min=0; max的getModifiers()和min和getModifiers也是不等的。
[/Quote]
多谢


1.我还是没找到有那样的方法
2.这个 我用Modifier.isPublic(fieldCase.getModifiers())来替代了原来错误的代码了

wgj830823 2010-05-13
  • 打赏
  • 举报
回复
[Quote=引用 18 楼 zhangjihao 的回复:]
哦,理解楼主的意思了,我似乎发现了点问题:
1、Field[] flds = M.getClass().getDeclaredFields();这句不报错吗?且与下面的定义能看出有什么不同?
Field[] flds1 = M.class.getClass().getDeclaredFields();
Field[] flds2 = this.getClass().getDeclaredFields();
注意flds、flds1、flds2三个数组中的值是不同的,不信可以测一下(这涉及运行方法的修饰符类型)。

2、getModifiers()的值:
1).Member.PUBLIC和Member.DECLARED有什么不同?
2).
public int max=100;
public static int min=0;
max的getModifiers()和min和getModifiers()值相等吗?

把这些问题弄清了,问题就迎刃而解。
[/Quote]
多谢帮忙
1.运行方法的修饰符问题能不能给详细讲讲,另外 M.class 这个直接编译就不通过的啊
2.Modifier我查了资料,一个field应该可以有多个修饰符,
这里改成 Modifier.isPublic(fieldCase.getModifiers())应该就可以了吧
humanity 2010-05-11
  • 打赏
  • 举报
回复
Java 反射出错时我们常碰到 2 种情况。

可能性,代理之类的类的类名打印出来看看一下,如果是类似 CGLib 这种代理直接继承的话,反射是正常的,而用 Proxy 这种代理不知道是不是相同,这个我没接触过,可以去用 Spring 的带 interface 支持的 AOP 测试一下。

另外一种情况:当我们的一个类有内部类做委托时也可能出现错,而这时它说的 类 B 其实不是你当时所说的 M 类,而是一个某个内部类,报错时不一定是说 field / method 是私有的而是说那个内部类是私有的,这时外部类是不能反射访问的。

javaANDcobol 2010-05-11
  • 打赏
  • 举报
回复
1.可能你调用的那个方法不能访问私有变量,还有个方法可以访问所有变量的,你去找找看。

2.flds、flds1、flds2三个数组中的值是不同的,而且Member.PUBLIC和Member.DECLARED得值是不等的,public int max=100;public static int min=0; max的getModifiers()和min和getModifiers也是不等的。
howsun_zh 2010-05-11
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 wgj830823 的回复:]
引用 10 楼 zhangjihao 的回复:

楼主的意思是将private类型的字段动态地改成public?反射没有这种修改能力吧?
建议用代理模式来做。


我这段代码就是嵌套在 代理里面的 ,是phprpc 服务器端 调用的时候,
我想在调用方法之前 把参数 处理一下
[/Quote]
哦,理解楼主的意思了,我似乎发现了点问题:
1、Field[] flds = M.getClass().getDeclaredFields();这句不报错吗?且与下面的定义能看出有什么不同?
Field[] flds1 = M.class.getClass().getDeclaredFields();
Field[] flds2 = this.getClass().getDeclaredFields();
注意flds、flds1、flds2三个数组中的值是不同的,不信可以测一下(这涉及运行方法的修饰符类型)。

2、getModifiers()的值:
1).Member.PUBLIC和Member.DECLARED有什么不同?
2).
public int max=100;
public static int min=0;
max的getModifiers()和min和getModifiers()值相等吗?

把这些问题弄清了,问题就迎刃而解。


So_So 2010-05-11
  • 打赏
  • 举报
回复
你SET 之前先看下 是否已经过滤掉了啊 然后你那个arg[i]的东西 给输出来 LOOK 下

把值都拿出来看下 哪里不对改哪里
justlearn 2010-05-11
  • 打赏
  • 举报
回复
你用的是Member.public 这个值是0,应该用Modifier.PUBLIC来判断是否是public
justlearn 2010-05-11
  • 打赏
  • 举报
回复
(fieldCase.getModifiers() & Modifier.PUBLIC) == 1
改成这样判断是否public看看
wgj830823 2010-05-11
  • 打赏
  • 举报
回复
问题没解决 追加 分数
wgj830823 2010-05-11
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 justlearn 的回复:]

fieldCase.setAccessible(true);去掉看看
[/Quote]


去掉了也是一样的错误
wgj830823 2010-05-11
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 zhangjihao 的回复:]

楼主的意思是将private类型的字段动态地改成public?反射没有这种修改能力吧?
建议用代理模式来做。
[/Quote]

我这段代码就是嵌套在 代理里面的 ,是phprpc 服务器端 调用的时候,
我想在调用方法之前 把参数 处理一下
justlearn 2010-05-11
  • 打赏
  • 举报
回复
fieldCase.setAccessible(true);去掉看看
howsun_zh 2010-05-11
  • 打赏
  • 举报
回复
楼主的意思是将private类型的字段动态地改成public?反射没有这种修改能力吧?
建议用代理模式来做。
wgj830823 2010-05-11
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 faith_wolf 的回复:]

fieldCase.getModifiers() == Member.PUBLIC)

把这个条件放在第一位置试试 先过滤掉再 去做其他的

谢谢!
[/Quote]


让你谢的我一头冷汗



经调试异常时在set()的时候报的,跟这个位置没啥关系的

谢谢谢谢
So_So 2010-05-11
  • 打赏
  • 举报
回复
fieldCase.getModifiers() == Member.PUBLIC)

把这个条件放在第一位置试试 先过滤掉再 去做其他的

谢谢!
wgj830823 2010-05-11
  • 打赏
  • 举报
回复
我来把条件分一下行


if(fieldCase.getType().getName().equals("java.lang.String")
&& fieldCase.get(args[i]) != null
&& fieldCase.getModifiers() == Member.PUBLIC){



shine333 2010-05-11
  • 打赏
  • 举报
回复
从字面上看,代码没错啊
wgj830823 2010-05-11
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 gaokong7268182 的回复:]

访问了私有成员!!!!!!!!!!!!
[/Quote]


谢谢您给我翻译了一下标题
wgj830823 2010-05-11
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 justlearn 的回复:]

M里的成员变量是private的吧
[/Quote]
我的条件里还有这样一条
&& fieldCase.getModifiers() == Member.PUBLIC


应该过滤掉private的成员了
加载更多回复(3)

67,515

社区成员

发帖
与我相关
我的任务
社区描述
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
社区管理员
  • Java EE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧