泛型 反射 实例化
场景:Java通过反射实例化泛型类的有关问题
Java通过反射实例化泛型类的问题
Java语言中,想通过反射实例化一个抽象类的子类,问题也可以简化点,可以建个类继承这个抽象类,然后实例化子类。
在代码中可以这么写:
但是如果通过反射,怎么把String这个type传进去,或者通过反射获得constructor,怎么把泛型信息传进去
下面这个是个错误的写法,只是说明要实现的内容:
------解决方案--------------------
泛型只在编译器存在,不存在于运行期
所以,对于反射这种运行期代码,是不需要任何泛型输入的
泛型只是在于编译器检查附加对象用的
就像List<String>,在实际运行中,List其实还是很以前一样,可以存放任意对象,只是如果你指定了泛型类型,编译时会检查你存入的对象是否符合String类
------解决方案--------------------
for example
Java通过反射实例化泛型类的问题
Java语言中,想通过反射实例化一个抽象类的子类,问题也可以简化点,可以建个类继承这个抽象类,然后实例化子类。
- Java code
public abstract class MyClass<T> { MyClass() { } }
在代码中可以这么写:
- Java code
new MyClass<String>() {}
但是如果通过反射,怎么把String这个type传进去,或者通过反射获得constructor,怎么把泛型信息传进去
下面这个是个错误的写法,只是说明要实现的内容:
- Java code
new MyClass<Class.forName("String")>() { }
------解决方案--------------------
泛型只在编译器存在,不存在于运行期
所以,对于反射这种运行期代码,是不需要任何泛型输入的
泛型只是在于编译器检查附加对象用的
就像List<String>,在实际运行中,List其实还是很以前一样,可以存放任意对象,只是如果你指定了泛型类型,编译时会检查你存入的对象是否符合String类
------解决方案--------------------
for example
- Java code
import java.lang.reflect.*; public class Test { static class A<T> { T t; public void test() { System.out.println(t); } } static class B<T> { T t; public B(T t) {this.t = t;} public void test() {System.out.println(t);} } public static void main(String[] args) throws Throwable { Class<?> c = A.class; Object o = c.newInstance(); Method m = c.getDeclaredMethod("test"); m.invoke(o); c = B.class; Constructor con = c.getDeclaredConstructor(new Class[]{Object.class}); //用Object.class代替T o = con.newInstance(new Object[]{"bbb"}); m = c.getDeclaredMethod("test"); m.invoke(o); } }