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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 汪小照 中级黑马   /  2012-9-28 11:13  /  1901 人查看  /  8 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 汪小照 于 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
)

评分

参与人数 1技术分 +1 收起 理由
刘芮铭 + 1 赞一个!

查看全部评分

8 个回复

倒序浏览
本帖最后由 刘学 于 2012-9-28 11:29 编辑

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

评分

参与人数 1技术分 +1 收起 理由
刘芮铭 + 1 赞一个!

查看全部评分

回复 使用道具 举报
那如果使用class.forName这种方式拿到student字节码,怎么拿呢?
回复 使用道具 举报
刘学 发表于 2012-9-28 11:20
Exception in thread "main" java.lang.ClassNotFoundException: Student
这是Student类没有找到异常,你的 ...

那如果使用class.forName这种方式拿到student字节码,怎么拿呢?
回复 使用道具 举报
汪小照 发表于 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 11:49
Class cls = Class.forName("java.lang.Student");  你这种方式对,语法也没错。只是程序找不到java.lang ...

那也就只有-用另外两种方式拿
回复 使用道具 举报
刘学 发表于 2012-9-28 11:49
Class cls = Class.forName("java.lang.Student");  你这种方式对,语法也没错。只是程序找不到java.lang ...

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

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

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