首先我们来说第一个问题:
我们顶一个arraylist集合的时候,通常会有泛型约束,比如:
ArrayList array = new ArrayList<>();
我们在array中只能添加Integer类型数据,那么,能否添加String,或者其他Object类型的数据呢?这里我们就可以利用反射来实现:
代码如下:
ArrayList<Integer> array = new ArrayList<>();
Class c = array.getClass();
Method m = c.getMethod("add", Object.class);
m.invoke(array, "hello");
m.invoke(array, "world");
System.out.println(array);
1.首先获取集合arraylist的class字节码文件,
2.获取字节码文件中的add方法,形参是Object.class类型,
3.invoke执行,第一个参数是执行的对象,第二个方法是实参。
通过以上就可以实现向集合里添加各种类型的元素
第二个问题:
我们可不可以写一个工具类,来get任何类的任何属性赋值。
public void setProperty(Object obj, String propertyName, Object value)
throws NoSuchFieldException, SecurityException,
IllegalArgumentException, IllegalAccessException {
// 根据对象获取字节码文件对象
Class c = obj.getClass();
// 获取该对象的propertyName成员变量
Field field = c.getDeclaredField(propertyName);
// 取消访问检查
field.setAccessible(true);
// 给对象的成员变量赋值为指定的值
field.set(obj, value);
}
下面我们写一个测试类:
public class ToolDemo {
public static void main(String[] args) throws NoSuchFieldException,
SecurityException, IllegalArgumentException, IllegalAccessException {
Person1 p = new Person1();
Tool t = new Tool();
t.setProperty(p, "name", "林青霞");
t.setProperty(p, "age", 27);
System.out.println(p);
System.out.println("-----------");
Dog d = new Dog();
t.setProperty(d, "sex", '男');
t.setProperty(d, "price", 12.34f);
System.out.println(d);
}
}
实践证明,我们是完全可以实现的。
通过以上我们发现,反射是如此强大,接下来我们会依靠反射引出动态代理,和cglib代理,进而进入Aop的学习。