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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

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);
        }
}

9 个回复

倒序浏览

这是两个获得构造方法的方法,你一个也没写对。
回复 使用道具 举报
// 获取构造函数
                 Constructor cons = clazz.getConstructor(null);  我之前是这样写的  
回复 使用道具 举报
水竹 发表于 2014-10-9 20:19
这是两个获得构造方法的方法,你一个也没写对。

我感觉我的思路是正确的  是不是那个地方出错了
回复 使用道具 举报
还没自学到反射,过来看看
回复 使用道具 举报
dsh 发表于 2014-10-9 20:37
我感觉我的思路是正确的  是不是那个地方出错了

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

它要求是公共构造方法才可以,你那个类没写构造方法应该生成了一个默认的不带访问修饰符的,所以提示NoSuch……Exception。
回复 使用道具 举报
dsh 中级黑马 2014-10-9 21:10:48
7#
水竹 发表于 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:50
8#
我知道答案了       // 创建该类的字节码对象
                 Class clazz = Class.forName("ToStringDemo");

这里要写全称Class clazz = Class.forName("dsh_1009_Base.ToStringDemo");
回复 使用道具 举报
水竹 中级黑马 2014-10-9 21:20:17
9#
dsh 发表于 2014-10-9 21:10
要怎么改   才可以  我现在改成这样了
package dsh_1009_Base;

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

呃,原来你是这里错了,我没注意那里,因为我是粘贴在Editplus里面运行的,所以把包之类的都去掉了……
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马