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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 王陶成 中级黑马   /  2012-9-23 19:17  /  2394 人查看  /  11 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 王陶成 于 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)



评分

参与人数 1技术分 +1 收起 理由
王德升 + 1 赞一个!

查看全部评分

11 个回复

倒序浏览
  1. TestArguments.class.getConstructor()
复制代码
这句代码是要获取类上一个“特定”的构造方法,因此需要给getConstructor()这个方法传递一些特定的参数。如果这个构造方法没有参数,则传递一个null就可以了。否则需要把构造方法参数列表中参数类型的Class实例全部传递给getConstructor()方法

评分

参与人数 1技术分 +1 收起 理由
admin + 1

查看全部评分

回复 使用道具 举报
  Constructor<TestArguments> con = TestArguments.class.getConstructor()[0];//这一句报错了,是什么原因了改成这样
回复 使用道具 举报
首先给你说说,利用反射得到构造函数的原理。就用你的例子。
Constructor<TestArguments> con = TestArguments.class.getConstructor();在这句话中,TestArguments.class只是得到一个类的字节码,类的字节码包含了很多信息。属性、方法、构造函数以及它们的修饰符等等一些信息。现在回到构造函数上面,一个类可能有很多个构造函数,怎么来区分呢。用形参的类型以及个数来区别。getConstructor()没有传递参数,你就是通过的没有参数的构造函数创建一个实例。
结果来了
我看,你定义的TestArguments类,把构造函数给覆写了,结果没有了,不需要传递参数的构造函数。所以会报错!
我猜的没错吧!
解决方法:给TestArguments类添加一个没有参数构造函数。

评分

参与人数 1技术分 +1 收起 理由
admin + 1

查看全部评分

回复 使用道具 举报
Constructor<TestArguments> con = TestArguments.class.getConstructor();//这一句报错了,是什么原因了

TestArguments??我好想没看看到这个类????
回复 使用道具 举报
没看到这个类?你没有编译前,程序有问题吗?如果没有,那就说明有这个类。如果有,那你就要小心了
回复 使用道具 举报
柳彬 中级黑马 2012-9-23 20:42:53
7#
因为这里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

评分

参与人数 1技术分 +1 收起 理由
admin + 1

查看全部评分

回复 使用道具 举报
赵永康 发表于 2012-9-23 19:46
Constructor con = TestArguments.class.getConstructor();//这一句报错了,是什么原因了

TestArguments? ...

类名写错了,改过来了
回复 使用道具 举报
赵永康 发表于 2012-9-23 19:46
Constructor con = TestArguments.class.getConstructor();//这一句报错了,是什么原因了

TestArguments? ...

类名写错了,改过来了
回复 使用道具 举报
hello_world! 发表于 2012-9-23 20:08
没看到这个类?你没有编译前,程序有问题吗?如果没有,那就说明有这个类。如果有,那你就要小心了 ...

复制的时候类名给弄错了
回复 使用道具 举报
柳彬 发表于 2012-9-23 20:42
因为这里public Constructor getConstructor(Class... parameterTypes)
需要传入构造参数的class,如果参数 ...

你这是那Class类的newInstance方法,这个方法我知道,能出来。我是想知道为什么拿constructor没法实例化
回复 使用道具 举报
柳彬 发表于 2012-9-23 20:42
因为这里public Constructor getConstructor(Class... parameterTypes)
需要传入构造参数的class,如果参数 ...

嗯 这个强悍 顶一下
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马