天天看点

java反射--通过反射越过泛型检查(2)

ArrayList<Integer>的一个对象,在这个集合中添加一个字符串数据

test2.java

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


public class test2 {

	/**
	 * @param args
	 * * A:案例演示
	* ArrayList<Integer>的一个对象,在这个集合中添加一个字符串数据,如何实现呢?
	* 泛型是在编译时期检查的,但是在运行期会被擦除掉
	 * @throws Exception 
	 */
	public static void main(String[] args) throws Exception {
		ArrayList<Integer> list = new ArrayList<>();
		list.add(111);
		list.add(222);
		list.add(333);
		list.add(444);
		
		Class<?> clazz = Class.forName("java.util.ArrayList");
		Method m = clazz.getMethod("add", Object.class);
		Object obj = m.invoke(list, "abc");
		System.out.println(obj);									//打印的是add方法的返回值
		System.out.println(list);
	}

}

           

输出:

true
[111, 222, 333, 444, abc]
           

此方法可将obj对象中名为propertyName的属性的值设置为value。

test3.java

package cn.ldw.test;

import java.lang.reflect.Field;

public class Test3 {
	//此方法可将obj对象中名为propertyName的属性的值设置为value。
	public void setProperty(Object obj, String propertyName, Object value) throws Exception{
		Class<?> clazz = obj.getClass();					//获取到该对象的字节码对象
		Field f = clazz.getDeclaredField(propertyName);		//暴力获取该字段的名字
		f.setAccessible(true);								//去除权限
		f.set(obj, value);									//修改属性值
	}
}
           

test4.java

public class test4 {

	/**
	 * @param args
	 * @throws Exception 
	 */
	public static void main(String[] args) throws Exception {
		Student s = new Student();
		test3 t = new test3();
		System.out.println(s);
		
		t.setProperty(s, "name","李四" );
		t.setProperty(s, "age", 24);
		
		System.out.println(s);
	}

}

class Student {
	private String name;
	public int age;
	
	public String toString() {
		return name + " ," + age;
	}
}
           

输出:

null ,0
李四 ,24