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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 何创 中级黑马   /  2013-1-30 03:24  /  1668 人查看  /  5 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 张向辉 于 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)

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


5 个回复

倒序浏览
Method的invoke方法在返回值为基本类型时会自动将其打包成包装类,
所以你这个例子中实际返回的是个Integer类型的对象,你可以用Integer对象接收
然后直接打印就行了,没必要转成字符串再打印。
        Integer relValue= (Integer) method.invoke(zc);
        System.out.println(relValue);

回复 使用道具 举报
本帖最后由 唐晓 于 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。
回复 使用道具 举报
二楼正解啊
回复 使用道具 举报
黑马张英涛 发表于 2013-1-30 08:14
Method的invoke方法在返回值为基本类型时会自动将其打包成包装类,
所以你这个例子中实际返回的是个Integer ...

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

呵呵 谢谢啦 我没注意 invoke()返回值类型 刚才看了下 ,,返回的是Object  类型 。对,接受这个参数确实要用integer、
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马