黑马程序员技术交流社区

标题: 关于内省读取私有字段问题 [打印本页]

作者: 何创    时间: 2013-1-30 03:24
标题: 关于内省读取私有字段问题
本帖最后由 张向辉 于 2013-1-31 22:11 编辑

这是我写的一个有私有字段x的类:
package it.cast.neixing;
public class zhouchang {


private int x ;
public int y;

public int getX() {
  return x;
}
public void setX(int x) {
  this.x = x;
}
public int getY() {
  return y;
}
public void setY(int y) {
  this.y = y;
}
public zhouchang(int x, int y) {
  super();
  this.x = x;
  this.y = y;
}

}
我又写了一个类 使用内省方法读取里面私有的属性:
上面这些包已经导入  没有包的异常,我就不写包导入了。
public  class readdemo{

public static void main(String[] args) throws Exception{
  
  zhouchang zc = new zhouchang(1,9);  
  String PropertyName ="x";
   //PropertyDescriptor属性描述器
  PropertyDescriptor prop = new PropertyDescriptor(PropertyName,zc.getClass());  
  Method method = prop.getReadMethod();
  String ReValue = (String) method.invoke(zc);
  System.out.println(ReValue);

}

}
结果发生了错误:
Exception in thread "main" java.lang.ClassCastException: java.lang.Integer cannot be cast to java.lang.String
at it.cast.neixing.neixingdemo.main(neixingdemo.java:31)

它说是转换异常 。。想很久没想出来。。问问大家  这为什么是类转换异常  可是视频的代码 和我一样  为什么能运行。。、?? 帮忙解决下  谢谢了!



作者: 黑马张英涛    时间: 2013-1-30 08:14
Method的invoke方法在返回值为基本类型时会自动将其打包成包装类,
所以你这个例子中实际返回的是个Integer类型的对象,你可以用Integer对象接收
然后直接打印就行了,没必要转成字符串再打印。
        Integer relValue= (Integer) method.invoke(zc);
        System.out.println(relValue);


作者: 唐晓    时间: 2013-1-30 08:34
本帖最后由 唐晓 于 2013-1-30 08:36 编辑
  1.                   Method method = prop.getReadMethod();        
  2.                   Integer reValue=(Integer)method.invoke(zc);
  3.                   System.out.println(reValue);                 
  4.                  
复制代码
method.invoke(zc)返回值是Integer,你强转成String就会报错了。你如果非要强转,可以用Integer.toString(reValue)强转成String。
作者: vmvm555    时间: 2013-1-30 12:23
二楼正解啊
作者: 何创    时间: 2013-1-30 13:11
黑马张英涛 发表于 2013-1-30 08:14
Method的invoke方法在返回值为基本类型时会自动将其打包成包装类,
所以你这个例子中实际返回的是个Integer ...

呵呵 谢谢啦 我没注意 invoke()返回值类型 刚才看了下 ,,返回的是Object  类型 。对,接受这个参数确实要用integer、
作者: 何创    时间: 2013-1-30 13:11
唐晓 发表于 2013-1-30 08:34
method.invoke(zc)返回值是Integer,你强转成String就会报错了。你如果非要强转,可以用Integer.toString(r ...

呵呵 谢谢啦 我没注意 invoke()返回值类型 刚才看了下 ,,返回的是Object  类型 。对,接受这个参数确实要用integer、




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