黑马程序员技术交流社区

标题: 反射调用成员方法 [打印本页]

作者: 王陶成    时间: 2012-9-23 19:17
标题: 反射调用成员方法
本帖最后由 王陶成 于 2012-9-23 21:30 编辑

使用反射调用Test  类的main方法。

import java.lang.reflect.Constructor;
import java.lang.reflect.Method;


public class Arguments_23 {
        public static void main(String[] args) throws Exception {

                //实例化test类
                Constructor<TestArguments> con = TestArguments.class.getConstructor();//这一句报错了,是什么原因了


                TestArguments test = (TestArguments)con.newInstance();

                //调用main方法
                Method mainMethod = TestArguments.class.getMethod("main", String[].class);
                mainMethod.invoke(test, new Object[]{new String[]{"abc", "efg", "kkdk"}});
        }
}

class TestArguments { //复制的时候类名给弄错了不好意思。。
        public void main(String[] args) {
                for(String arg : args) {
                        System.out.println(arg);
                }
        }

}


报错
Exception in thread "main" java.lang.NoSuchMethodException: day.TestArguments.<init>()
        at java.lang.Class.getConstructor0(Class.java:2706)
        at java.lang.Class.getConstructor(Class.java:1657)
        at day.Arguments_23.main(Arguments_23.java:8)




作者: 王海宇    时间: 2012-9-23 19:23
  1. TestArguments.class.getConstructor()
复制代码
这句代码是要获取类上一个“特定”的构造方法,因此需要给getConstructor()这个方法传递一些特定的参数。如果这个构造方法没有参数,则传递一个null就可以了。否则需要把构造方法参数列表中参数类型的Class实例全部传递给getConstructor()方法
作者: 尤圣回    时间: 2012-9-23 19:41
  Constructor<TestArguments> con = TestArguments.class.getConstructor()[0];//这一句报错了,是什么原因了改成这样
作者: hello_world!    时间: 2012-9-23 19:45
首先给你说说,利用反射得到构造函数的原理。就用你的例子。
Constructor<TestArguments> con = TestArguments.class.getConstructor();在这句话中,TestArguments.class只是得到一个类的字节码,类的字节码包含了很多信息。属性、方法、构造函数以及它们的修饰符等等一些信息。现在回到构造函数上面,一个类可能有很多个构造函数,怎么来区分呢。用形参的类型以及个数来区别。getConstructor()没有传递参数,你就是通过的没有参数的构造函数创建一个实例。
结果来了
我看,你定义的TestArguments类,把构造函数给覆写了,结果没有了,不需要传递参数的构造函数。所以会报错!
我猜的没错吧!
解决方法:给TestArguments类添加一个没有参数构造函数。

作者: 赵永康    时间: 2012-9-23 19:46
Constructor<TestArguments> con = TestArguments.class.getConstructor();//这一句报错了,是什么原因了

TestArguments??我好想没看看到这个类????

作者: hello_world!    时间: 2012-9-23 20:08
没看到这个类?你没有编译前,程序有问题吗?如果没有,那就说明有这个类。如果有,那你就要小心了
作者: 柳彬    时间: 2012-9-23 20:42
因为这里public Constructor<T> getConstructor(Class<?>... parameterTypes)
需要传入构造参数的class,如果参数用null会出现警告,我有另一种办法实现它
代码如下:
import java.lang.reflect.Constructor;
import java.lang.reflect.Method;


public class Arguments_23 {
         public static void main(String[] args) throws Exception {

                //实例化test类
                 Class clazz=Class.forName("TestArguments");


                TestArguments test = (TestArguments)clazz.newInstance();

                //调用main方法
                 Method mainMethod = TestArguments.class.getMethod("main", String[].class);
                 mainMethod.invoke(test, new Object[]{new String[]{"abc", "efg", "kkdk"}});
         }
}

class TestArguments {
             
         public  void main(String[] args) {
                 for(String arg : args) {
                         System.out.println(arg);
                 }
         }

}

运行结果:
abc
efg
kkdk

作者: 王陶成    时间: 2012-9-23 21:31
赵永康 发表于 2012-9-23 19:46
Constructor con = TestArguments.class.getConstructor();//这一句报错了,是什么原因了

TestArguments? ...

类名写错了,改过来了
作者: 王陶成    时间: 2012-9-23 21:32
赵永康 发表于 2012-9-23 19:46
Constructor con = TestArguments.class.getConstructor();//这一句报错了,是什么原因了

TestArguments? ...

类名写错了,改过来了
作者: 王陶成    时间: 2012-9-23 21:32
hello_world! 发表于 2012-9-23 20:08
没看到这个类?你没有编译前,程序有问题吗?如果没有,那就说明有这个类。如果有,那你就要小心了 ...

复制的时候类名给弄错了
作者: 王陶成    时间: 2012-9-23 21:35
柳彬 发表于 2012-9-23 20:42
因为这里public Constructor getConstructor(Class... parameterTypes)
需要传入构造参数的class,如果参数 ...

你这是那Class类的newInstance方法,这个方法我知道,能出来。我是想知道为什么拿constructor没法实例化
作者: 赵永康    时间: 2012-9-23 22:43
柳彬 发表于 2012-9-23 20:42
因为这里public Constructor getConstructor(Class... parameterTypes)
需要传入构造参数的class,如果参数 ...

嗯 这个强悍 顶一下




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