黑马程序员技术交流社区

标题: 哪里错了着急 [打印本页]

作者: axing110    时间: 2014-10-30 22:25
标题: 哪里错了着急
package test;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;




/*编写一个类A,增加一个实例方法show用于打印一条字符串。再编写一个TestA,作为客户端,
* 键盘录入一个字符串,该字符串就是类A的全名,使用反射手段创建该类的对象, 并调用该对象中的方法show*/


public class test1{

        public static void main(String[] args) throws IOException, ClassNotFoundException, InstantiationException, IllegalAccessException, NoSuchMethodException, SecurityException, IllegalArgumentException, InvocationTargetException
        {
                System.out.println("请输入一个字符串:");
                BufferedReader buff=new BufferedReader(new InputStreamReader(System.in));
                String str=buff.readLine();
                Class cs= Class.forName(str);
                Object obj=cs.getConstructor().newInstance();
                Method me=cs.getMethod("show");
                me.invoke(obj);
          
          
        }
}
class A
{

        public void show()
        {
                System.out.println("黑马程序员");
        }
}



作者: xplcc    时间: 2014-10-30 22:42
Object obj=cs.getConstructor().newInstance();改成A obj = (A)cs.getConstructor().newInstance();
作者: sk0806    时间: 2014-10-30 22:50
本帖最后由 sk0806 于 2014-10-30 22:53 编辑

Object obj=cs.getConstructor().newInstance();改为Object obj=cs.newInstance();可以调用到show方法输入字符串时,加上你的包名:test.A

作者: 刘家斌    时间: 2014-10-30 22:53
Object obj=cs.getConstructor().newInstance();
Method me=cs.getMethod("show");
me.invoke(obj);
这三句话,首先你第一句创建的是object类型的对象,这个是多态,但object类中没有show方法,再次getMethod方法和invoke方法都是接收的两个参数吧,是不是应该加个null?

作者: MeryStyle    时间: 2014-10-30 23:14
obj 忘了强转类型了
作者: wzg1015    时间: 2014-10-31 07:52
本帖最后由 wzg1015 于 2014-10-31 08:06 编辑

cs.getConstructors(),你先通过这个来将全部的构造函数取出后打印,会发现一个都没找到。这种问题要么是没有,要么是没权限。
你的class A 是默认的,也就是说它的构造函数也是默认的,而cs.getConstructor()是找到的public构造函数,所以是找不到的。要么将A的构造函数改成public,要么新建一个A.java,移出去,类修饰改成public

作者: axing110    时间: 2014-10-31 08:03
晕死都不是大家讲的原因哦噢噢噢噢,我自己找到了,不容易发现的原因,是因为我的构造函数是隐式的,没有被public修饰,所以在getConstructor无法找到这样的一个构造函数,改成getDeclareConstructor就可以了呵呵感谢大家。




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