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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© dsh 中级黑马   /  2014-10-9 21:30  /  919 人查看  /  1 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

我总是把字节码对象名和  对象名   以及通过反射获取的方法名 弄混
一下的两个问题我都遇到了问题,  看看这两个题,心中没有一个明确的思路


package dsh_1009_Base;

import java.lang.reflect.Method;
import java.util.ArrayList;

/**
*9、ArrayList<Integer> list = new ArrayList<Integer>();
* 在这个泛型为Integer的ArrayList中存放一个String类型的对象。
* 注意:通过反射来分析并实现
*
*/
public class ReflectTest02 {

        public static void main(String[] args) throws Exception {
                //创建集合
                ArrayList<Integer> list = new ArrayList<Integer>();
               
                //获取集合的字节码对象
                Class clazz = list.getClass();
                //我不知道这里为什么不写成如下
                //Class clazz = Class.forName("ArrayList");
                //Object newInstance = clazz.newInstance();
               
                //System.out.println(newInstance);
               
                //获取里面的方法
                Method method = clazz.getMethod("add", Object.class);
               
                method.invoke(list, "adcjsl");
               
               
                System.out.println(list.get(0));
               

        }

}



第二题
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("dsh_1009_Base.ToStringDemo");
                //System.out.println(clazz);

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

                // 通过构造器构造该类对象
                Object newObj = cons.newInstance();
                //System.out.println();
                // 通过字节码对象获取里面的有参方法
                Method method = clazz.getMethod("strToString", String.class);

                // public Object invoke(Object obj, Object... args)
                method.invoke(newObj, "你好,世界");
               
//                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);
        }
}

1 个回复

正序浏览
关于楼主第一道题的问题,Class clazz = Class.forName("ArrayList");这个语句不正确的原因在于,Class.forName()里面参数传的必须是类名的全名,即包名.类名,也就是说无论你导不导入包,都应该写成
Class.forName("java.util.ArrayList");这样才是正确的
关于楼主的第二道题,问题在于楼主获取空参数的构造函数时,Constructor cons = clazz.getConstructor(null);这时里面不应该传入null,直接写成Constructor cons = clazz.getConstructor();就可以了,否则jvm会认为你传入了一个参数,只不过参数的值是null而已。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马