黑马程序员技术交流社区

标题: 通过反射方式调用类方法的问题 [打印本页]

作者: 程潇    时间: 2012-7-20 13:36
标题: 通过反射方式调用类方法的问题
我想通过反射调用Person类中的run方法,但是报ClassNotFoundException异常。
可是Person这个类的class文件是存在的,请教各位,为什么回报这个异常

代码如下:

import java.lang.reflect.Method;

public class Test
{
       public static void main(String args[]) throws Exception
       {
                            Class cls = Class.forName("Person");
                        Method method = cls.getMethod("run", null);
                        method.invoke(cls.newInstance(), null);
       }
}

class Person{
        public void run(){
                System.out.println("Person run");
        }
}

报如下错误:
Exception in thread "main" java.lang.ClassNotFoundException: Person
        at java.net.URLClassLoader$1.run(URLClassLoader.java:200)
        at java.security.AccessController.doPrivileged(Native Method)
        at java.net.URLClassLoader.findClass(URLClassLoader.java:188)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:307)
        at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:301)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:252)
        at java.lang.ClassLoader.loadClassInternal(ClassLoader.java:320)
        at java.lang.Class.forName0(Native Method)
        at java.lang.Class.forName(Class.java:169)
        at score.technology.Test.main(Test.java:9)




作者: 周玉龙    时间: 2012-7-20 13:48
import java.lang.reflect.Method;

public class Test
{
       public static void main(String args[]) throws Exception
       {
                            Class cls = Class.forName("Person");
                        Method method = cls.getMethod("run");//我想是这样的,你的run方法没有接受参数,就可以不用写了,你在这里写了个null,程序就会去找一个带参数的run方法.只不过你 传的参数是null
                        method.invoke(cls.newInstance());//这里也是一样
       }
}

class Person{
        public void run(){
                System.out.println("Person run");
        }
}
//
作者: 王飞    时间: 2012-7-20 13:49
个么   在我的机器上运行的结果没有报错
结果是:Person run

作者: 程潇    时间: 2012-7-20 13:56
周玉龙 发表于 2012-7-20 13:48
import java.lang.reflect.Method;

public class Test

尝试了一下你的方法,还是报相同的异常
作者: 王璐    时间: 2012-7-20 13:56
本帖最后由 王璐 于 2012-7-20 13:59 编辑

import java.lang.reflect.Method;

public class Test
{
       public static void main(String args[]) throws Exception
       {
                            Class cls = Class.forName("Person");    //Person得加上完整的包名,加上后就可以运行了
                        Method method = cls.getMethod("run", null);
                        method.invoke(cls.newInstance(), null);
       }
}

class Person{
        public void run(){
                System.out.println("Person run");
        }
}
“我添加的是我包,你包名补上”




作者: 胡文杰    时间: 2012-7-20 14:00
我运行没有错啊!
作者: 胡文杰    时间: 2012-7-20 14:01
public static void main(String[] args) throws Exception
{
        Method method = Person.class.getMethod("run",String.class);
        method.invoke(Person.class.newInstance(), "abc");
}
class Person{
        public void run(String str){
                System.out.println(str);
        }
}
作者: 程潇    时间: 2012-7-20 14:03
王璐 发表于 2012-7-20 13:56
import java.lang.reflect.Method;

public class Test

多谢了,加上包名以后可以了
作者: 程潇    时间: 2012-7-20 14:04
谢谢大家的回答




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