黑马程序员技术交流社区

标题: 关于反射抛异常的问题 [打印本页]

作者: 汪小照    时间: 2012-9-28 11:13
标题: 关于反射抛异常的问题
本帖最后由 汪小照 于 2012-9-28 13:38 编辑

import java.lang.reflect.Method;
public class RflectTest {
public static void main(String [] args) throws Exception
{
  Class cls = Class.forName("java.lang.Student");  //为什么程序在这会抛出异常呢?
                                                                          //拿到一个类的字节码有三种方式: 类名.class   对象.getClass()   Class.forName("传递的类名的全程")
                                                                        //我使用第三种拿字节码,请问会抛出异常?
  Student s =(Student)cls.newInstance();
  //拿到Student类的方法
  Method method = cls.getMethod("show");
  method.invoke(s, null);
  
}
}
class Student
{
public void show()
{
  System.out.println("反射的测试");
}
}
异常信息:
Exception in thread "main" java.lang.ClassNotFoundException: Student
at java.net.URLClassLoader$1.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(Unknown Source)
at java.lang.ClassLoader.loadClass(Unknown Source)
at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)
at java.lang.ClassLoader.loadClass(Unknown Source)
at java.lang.ClassLoader.loadClassInternal(Unknown Source)
at java.lang.Class.forName0(Native Method)
at java.lang.Class.forName(Unknown Source)
at com.heima.RflectTest.main(RflectTest.java:8
)

作者: 刘学    时间: 2012-9-28 11:20
本帖最后由 刘学 于 2012-9-28 11:29 编辑

Exception in thread "main" java.lang.ClassNotFoundException: Student
这是Student类没有找到异常,你的java.lang包下有Student类吗?
还有自己定义的包按照规范应该用反转域名去命名,
用java.lang命名自定义的包可能会被禁用,同时也会发生异常。

作者: 汪小照    时间: 2012-9-28 11:25
那如果使用class.forName这种方式拿到student字节码,怎么拿呢?
作者: 汪小照    时间: 2012-9-28 11:35
刘学 发表于 2012-9-28 11:20
Exception in thread "main" java.lang.ClassNotFoundException: Student
这是Student类没有找到异常,你的 ...

那如果使用class.forName这种方式拿到student字节码,怎么拿呢?

作者: 刘学    时间: 2012-9-28 11:49
汪小照 发表于 2012-9-28 11:35
那如果使用class.forName这种方式拿到student字节码,怎么拿呢?

Class cls = Class.forName("java.lang.Student");  你这种方式对,语法也没错。只是程序找不到java.lang.Student这个类。
Exception in thread "main" java.lang.ClassNotFoundException: Student  这句话不就是说Student没找到吗

比如你获取String字节码
Class c=Class.forName("java.lang.String");                 

而你的Student和主程序都在同一个包中
应该是Class c=Class.forName("所在包全名.Student");  
作者: 汪小照    时间: 2012-9-28 12:40
刘学 发表于 2012-9-28 11:49
Class cls = Class.forName("java.lang.Student");  你这种方式对,语法也没错。只是程序找不到java.lang ...

那也就只有-用另外两种方式拿
作者: 汪小照    时间: 2012-9-28 12:41
刘学 发表于 2012-9-28 11:49
Class cls = Class.forName("java.lang.Student");  你这种方式对,语法也没错。只是程序找不到java.lang ...

目前根据我所掌握的知识就只有用另两种方式拿到类的字节码对象。
作者: 柳彬    时间: 2012-9-28 13:42
java.lang里没有Student的哈,所以找不到你的这个类,所以会报Exception in thread "main" java.lang.ClassNotFoundException: Student错误,你应该这么写,Class cls = Class.forName("Student");这样就可以找到哦
作者: 王海宇    时间: 2012-9-28 13:43
你的Student类class文件需要放在可以被虚拟机加载到的目录里,才可以使用forName()这个方法,否则的话就会抛出ClassNotFound异常。
能被虚拟机加载到的路径如图所示,javascript:;只要你把你的Student.class文件放到这些目录里,并且包含在与包名相对应的完整的目录结构里面,就可以使用Class.forName("完全包名.类名")的方式获得该类的字节码

图片1.png (130.8 KB, 下载次数: 17)

图片1.png





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