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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© pthuakai 中级黑马   /  2013-5-20 18:51  /  1290 人查看  /  7 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

package enhance_day1;
import java.lang.reflect.*;
import java.text.DateFormat.Field;
public class ReflectTest1 {
public static void main(String[] args) throws Exception, IllegalAccessException, ClassNotFoundException
{
  Constructor constructor= String.class.getConstructor(StringBuffer.class);
  String str2=(String)constructor.newInstance(new StringBuffer("abccd"));
  
  System.out.println(str2.charAt(2));
  
  
  ReflectPoint pt1=new ReflectPoint(3,5);
  java.lang.reflect.Field fieldY=pt1.getClass().getField("y");
  System.out.println(((java.lang.reflect.Field) fieldY).get(pt1));
  java.lang.reflect.Field fieldX=pt1.getClass().getDeclaredField("x");
  System.out.println(((java.lang.reflect.Field) fieldX).get(pt1));
  changeStringValue(pt1);
  System.out.println(pt1);
  
}
public static void changeStringValue(Object obj) throws Exception
{
  java.lang.reflect.Field[] fields=obj.getClass().getFields();
  for(java.lang.reflect.Field field:fields)
  {
    if(field.getType()==String.class);
    String oldValue=(String)field.get(obj);
    String newValue=oldValue.replace('b','a');
    field.set(obj,newValue);
   
  }
}
}
运行时提示

评分

参与人数 1技术分 +1 收起 理由
殇_心。 + 1

查看全部评分

7 个回复

倒序浏览
如下错误。
5
Exception in thread "main" java.lang.IllegalAccessException: Class enhance_day1.ReflectTest1 can not access a member of class enhance_day1.ReflectPoint with modifiers "private"
        at sun.reflect.Reflection.ensureMemberAccess(Reflection.java:65)
        at java.lang.reflect.Field.doSecurityCheck(Field.java:960)
        at java.lang.reflect.Field.getFieldAccessor(Field.java:896)
        at java.lang.reflect.Field.get(Field.java:358)
        at enhance_day1.ReflectTest1.main(ReflectTest1.java:20)
回复 使用道具 举报
本帖最后由 FantasticPie 于 2013-5-20 19:02 编辑

看你的异常的错误应该出现在ReflectPoint类中,ReflectTest1的反射类不能访问其中的私有属性。最好把ReflectPoint类也贴出来
回复 使用道具 举报
这个异常的意思大概就是:Test1类不能访问ReflectPoint类中被private修饰的成员。
所以原因是你的ReflectPoint中的属性有被private修饰。从错误提示可以看出来,你的Y属性不是私有的。
X属性是私有的。
这种情况要使用传说的“暴力”反射。
具体解决方法如下(代码调整了,导包后去掉了完整类名并注释了无关代码段):
  1. public class Test3 {
  2.         public static void main(String[] args) throws Exception,
  3.                         IllegalAccessException, ClassNotFoundException {
  4. //                Constructor constructor = String.class
  5. //                                .getConstructor(StringBuffer.class);
  6. //                String str2 = (String) constructor
  7. //                                .newInstance(new StringBuffer("abccd"));
  8. //
  9. //                System.out.println(str2.charAt(2));

  10. //                我写了一个ReflectPoint,y被private修饰,x不修饰。
  11.                 ReflectPoint pt1 = new ReflectPoint(3, 5);
  12.                 Field fieldY = pt1.getClass().getDeclaredField("y");
  13. //                增加这一行,下面同。"暴力"反射。你的y属性可以不用暴力反射。但x必须加。
  14.                 fieldY.setAccessible(true);
  15.                 System.out.println(fieldY.get(pt1));
  16.                
  17.                 Field fieldX = pt1.getClass().getDeclaredField("x");
  18.                 fieldX.setAccessible(true);
  19.                 System.out.println(fieldX.get(pt1));
  20. //                changeStringValue(pt1);
  21. //                System.out.println(pt1);
  22.         }
复制代码

评分

参与人数 1技术分 +1 收起 理由
刘胜寒 + 1

查看全部评分

回复 使用道具 举报
真相了。楼上好人
回复 使用道具 举报
异常这么明显。你来灌水的吧

点评

这你都发现了。  发表于 2013-5-21 07:59
回复 使用道具 举报
Sword 金牌黑马 2013-5-21 10:03:35
7#
灌水贴不给加分
回复 使用道具 举报
抱歉,编程不好,比不得你们这些高手。另外,非常感谢上面黑马伍哲沂的回答。万分感谢。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马