黑马程序员技术交流社区

标题: 谁来帮我看看我的这道反射题那个地方出错了 [打印本页]

作者: dsh    时间: 2014-10-9 20:11
标题: 谁来帮我看看我的这道反射题那个地方出错了
package dsh_1009_Base;

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

/**
* 编写一个类,增加一个实例方法用于打印一条字符串。并使用反射手段创建该类的对象,并调用该对象中的方法 分析:
* 1.首先要创建一个类,里面有个方法,作用是打印一个字符串
*
*/
public class ReflectTest01 {

        public static void main(String[] args) throws ClassNotFoundException,
                        NoSuchMethodException, SecurityException, InstantiationException,
                        IllegalAccessException, IllegalArgumentException,
                        InvocationTargetException {
                // 创建该类的字节码对象
                Class clazz = Class.forName("ToStringDemo");

                // 获取构造函数
                Constructor cons = clazz.getConstructor();

                // 通过构造器该类对象
                Object newObj = cons.newInstance();

                // 通过字节码对象获取里面的有参方法
                Method method = clazz.getMethod("strToString", String.class);

                // public Object invoke(Object obj, Object... args)
                method.invoke(newObj, new String("abcdef"));

        }

}

class ToStringDemo {
        public void strToString(String s) {
                System.out.println(s);
        }
}
作者: 水竹    时间: 2014-10-9 20:19

这是两个获得构造方法的方法,你一个也没写对。

作者: dsh    时间: 2014-10-9 20:35
// 获取构造函数
                 Constructor cons = clazz.getConstructor(null);  我之前是这样写的  
作者: dsh    时间: 2014-10-9 20:37
水竹 发表于 2014-10-9 20:19
这是两个获得构造方法的方法,你一个也没写对。

我感觉我的思路是正确的  是不是那个地方出错了
作者: 高泳    时间: 2014-10-9 20:41
还没自学到反射,过来看看
作者: 水竹    时间: 2014-10-9 20:58
dsh 发表于 2014-10-9 20:37
我感觉我的思路是正确的  是不是那个地方出错了

抱歉,我刚才说错了,写null和不都是可以的,真正的错误原因应该是这个:

它要求是公共构造方法才可以,你那个类没写构造方法应该生成了一个默认的不带访问修饰符的,所以提示NoSuch……Exception。

作者: dsh    时间: 2014-10-9 21:10
水竹 发表于 2014-10-9 20:58
抱歉,我刚才说错了,写null和不都是可以的,真正的错误原因应该是这个:

它要求是公共构造方法才可以, ...

要怎么改   才可以  我现在改成这样了
package dsh_1009_Base;

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

/**
* 编写一个类,增加一个实例方法用于打印一条字符串。并使用反射手段创建该类的对象,并调用该对象中的方法 分析:
* 1.首先要创建一个类,里面有个方法,作用是打印一个字符串
*
*/
public class ReflectTest01 {

        public static void main(String[] args) throws ClassNotFoundException,
                        NoSuchMethodException, SecurityException, InstantiationException,
                        IllegalAccessException, IllegalArgumentException,
                        InvocationTargetException {
                // 创建该类的字节码对象
                Class clazz = Class.forName("ToStringDemo");

                // 获取空参构造函数
                Constructor cons = clazz.getConstructor(null);

                // 通过构造器该类对象
                Object newObj = cons.newInstance();

                // 通过字节码对象获取里面的有参方法
                Method method = clazz.getMethod("strToString", String.class);

                // public Object invoke(Object obj, Object... args)
                method.invoke(newObj, new String("你好,世界"));
               
//                TestString t=TestString.class.newInstance();
//        //反射调用对象中的方法
//                TestString.class.getMethod("show",String.class).invoke(t, new String("abcdef"));

        }

}

class ToStringDemo {
       
        public ToStringDemo() {
                super();
                // TODO Auto-generated constructor stub
        }

        public void strToString(String s) {
                System.out.println(s);
        }
}
作者: dsh    时间: 2014-10-9 21:18
我知道答案了       // 创建该类的字节码对象
                 Class clazz = Class.forName("ToStringDemo");

这里要写全称Class clazz = Class.forName("dsh_1009_Base.ToStringDemo");
作者: 水竹    时间: 2014-10-9 21:20
dsh 发表于 2014-10-9 21:10
要怎么改   才可以  我现在改成这样了
package dsh_1009_Base;

感觉还是应该不写null,我加上泛型之后不加null没有警告,加了之后就多了个警告。
作者: 水竹    时间: 2014-10-9 21:21
dsh 发表于 2014-10-9 21:18
我知道答案了       // 创建该类的字节码对象
                 Class clazz = Class.forName("ToStringDem ...

呃,原来你是这里错了,我没注意那里,因为我是粘贴在Editplus里面运行的,所以把包之类的都去掉了……




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