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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 高双武 黑马帝   /  2011-11-19 09:25  /  2000 人查看  /  3 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 wudiisss 于 2011-11-19 10:42 编辑

编译报错?为什么?
package execisetest;
class Test2{
        public static int a=10;
}
public class Test {
        public static void main(String [] args) throws Exception{
                Object obj=Class.forName("Test2").newInstance();//这里的obj是指向Test2的实例对象
                System.out.println(obj.a);//为什么这里不能调用?
        }
}

3 个回复

倒序浏览
成杰 黑马帝 2011-11-19 09:28:38
沙发
本帖最后由 成杰 于 2011-11-19 09:40 编辑

利用反射向集合中加入元素时,由于是跳过编译器,所以不会有类型不匹配的问题,但是在取出数据时,是有类型的,因为集合中默认的加入的是一个Object类型的元素。可能你会想,在Integer类型的集合中取出加入的String的元素时,不会报错,那是因为在内部,自动执行了String.valueOf()方法,将Object类型转化成String类型,所以不需要强转。但是你的这种情况,必须进行类型的强转。
回复 使用道具 举报
你的test2被打包了,Object obj=Class.forName("Test2").newInstance();应该加上包名吧。
System.out.println(obj.a);
obj是一个Object类的引用,Object中式没有.a的成员数据的,换句话,使用中虽然有a,但a对父类object来说是不可见的。所以你需要强制类型转化。可是这里你也 不能这样写。
Class.forName("Test2").newInstance();返回的是字节码,如果你硬要当成object来使用,那是可以的。但最好换成
类名 obj=Class.forName("类名").newInstance();
这样应该就可以了。
我觉得强制类型转化应该放在这个对象的时候   类名 obj =Class.forName 。

评分

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

查看全部评分

回复 使用道具 举报
由于你声明的obj是个Object对象,Object对象是没有a()这个方法的,你要强制转换一下就可以了

评分

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

查看全部评分

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