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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 铿锵科技 中级黑马   /  2013-2-8 13:02  /  1641 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 铿锵科技 于 2013-2-12 17:52 编辑

我写了一个Person的类
package com.heima;
public class Person {
        private int age;
        private String name;
        public int getAge() {
                return age;
        }
        public void setAge(int age) {
                this.age = age;
        }
        public String getName() {
                return name;
        }
        public void setName(String name) {
                this.name = name;
        }

}

写一个测试反射的类,2个类在同一个包中用eclipse平台测试
public class Test {
        public static void main(String[] args) throws Exception {
         Class clazz=Person.class;//这句没有报错         //Class<?> clazz=Class.forName("Person");//换在这句就报错为什么
        Object obj=clazz.newInstance();
}
}
为什么上面的代码换成Class.forName时会报错?


评分

参与人数 1技术分 +1 收起 理由
杨志 + 1 希望好好加油!新年快乐。

查看全部评分

4 个回复

倒序浏览
因为Class.froName(String PackageAdnClassName)
      里面必须写上完整的包名和类名
      如果你在里面只写一个类名默认的是在缺省包下找Person这个类
      而缺省包下是没有这个类的所以就会报 ClassNotFountException,
      如果你不写上完整的包名java就不知道你要的是哪个包下的这个类
      比如Date这个类,在awt和util包下都有这个 类,你只写一个类名的话,
      你说它是哪一个类啊?
      同样道理你只写一个类名java也会迷得,
      主要的是你不写包名,java默认的会再缺省包下找Person类,而你的缺省包下
      是没有这个类的所以java就会报ClassNotFountException了;
      获取类的字节码文件有三种方式,他们分别是:
      1. 通过对象获取,对象.class
      2. 通过Class的静态方法forName来获得
      3. 通过类名 String.class
      字节码文件的方式不同而已
回复 使用道具 举报
缺少包名
回复 使用道具 举报
写一个测试反射的类,2个类在同一个包中用eclipse平台测试
public class Test {
        public static void main(String[] args) throws Exception {
         Class clazz=Person.class;//这句没有报错         //Class<?> clazz=Class.forName("Person");//换在这句就报错为什么
        Object obj=clazz.newInstance();
}
}
楼主问的是 //Class<?> clazz=Class.forName("Person");//换在这句就报错为什么
首先Class.forName("Person")这句有问题
Class.forName(xxx.xx.xx) 返回的是一个类, 当你的newInstance()后才在创建对象。
所以Class.forName("Person");里面参数需要包名,类型:com.heima.Peroson这样才能创建对象

希望对楼主有所帮助
回复 使用道具 举报
本帖最后由 杨志 于 2013-2-12 15:22 编辑

这是异常的问题。
这里是用Class.forName()
存在一个ClassNotFoundException异常。必须要捕获或者是是抛出。
否则编译器就会报错。
关于上面说的那些错误都是运行时错误。
编译器是检测不到的。
这里加一个try/catch()或者直接抛出就不会报错了
但是你如果包名没写对。
在运行的时候会报错。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马