JAVA-反射-暴力反射和泛型擦除

Posted torain

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JAVA-反射-暴力反射和泛型擦除相关的知识,希望对你有一定的参考价值。

JAVA-反射-暴力反射和泛型擦除


暴力反射

定义

在类中的某些成员变量或成员方法是私有的,这显然不希望我们显式使用,但是Java还是为我们提供了一个方法用来"暴力"的使用这些私有属性或方法。
Java中提供getDeclaredField()、getDeclaredMethod()、getDeclaredConstructor()等方法来获取包括私有的方法和属性,但是我们无法使用,使用setAccessible(true)方法可以使私有化暂时失效从而达到暴力反射的目的。

代码

public class Demo04 {
	public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException, SecurityException, InstantiationException, IllegalAccessException, IllegalArgumentException, InvocationTargetException {
		
		// 获取私有构造方法
		Class c = Class.forName("com.oracle.demo01.Person");
		Constructor con = c.getDeclaredConstructor(String.class, int.class);
		
		// 暴力反射
		con.setAccessible(true);
		
		// 调用构造方法
		Person p = (Person)con.newInstance("小狗", 1);
		p.eat();
		System.out.println(p.toString());

	}
}

泛型擦除

定义

注释和泛型是不进class文件的,说明泛型的底层是Object,而在编译期的泛型是用来约束代码的,因此我们可以直接反射调用add()方法添加不同类型的文件进同一个已经规定好泛型的集合。

代码

public class Fanxing {

	public static void main(String[] args) throws NoSuchFieldException, SecurityException, NoSuchMethodException, IllegalAccessException, IllegalArgumentException, InvocationTargetException {
		
		// 新建一个int集合,添加元素
		ArrayList<Integer> strArr =new ArrayList<Integer>();
		strArr.add(123);
		
		// 现在要将abc添加进去
		// 获取成员方法
		Class c = strArr.getClass();
		Method method = c.getMethod("add", Object.class);
		// 执行方法
		method.invoke(strArr, "abc");
		System.out.println(strArr);

	}

}

以上是关于JAVA-反射-暴力反射和泛型擦除的主要内容,如果未能解决你的问题,请参考以下文章

java通过反射获取私有的构造方法,及反射擦除泛型数据类型约束

Java 泛型泛型用法 ( 泛型编译期擦除 | 上界通配符 <? extends T> | 下界通配符 <? super T> )

java 反射和泛型-反射来获取泛型信息

Java 之 泛型擦除

java 反射和泛型

Day642.反射注解和泛型问题 -Java业务开发常见错误