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