java泛型 java泛型
程序员文章站
2022-04-05 12:57:49
...
参考:http://blog.csdn.net/lonelyroamer/article/details/7868820
文章参考上面的链接。下面是个人总结:
泛型信息在编译后即被擦除,但是泛型信息会被写入到.class文件中,因此通过反射仍能拿到泛型信息。如代码:
通过bytecode插件可以看到如下字节码:
就是因为字节码中保存了泛型信息,才能通过反射得到。
文章参考上面的链接。下面是个人总结:
泛型信息在编译后即被擦除,但是泛型信息会被写入到.class文件中,因此通过反射仍能拿到泛型信息。如代码:
public class Test extends ArrayList<String>{ List<Integer> d = new ArrayList<Integer>(); private void test(List<Float> a){ } public static void main(String...args) throws NoSuchFieldException, SecurityException, NoSuchMethodException{ Field field = Test.class.getDeclaredField("d"); Type type = field.getGenericType(); if(type == null){ return; } if(type instanceof ParameterizedType){ System.out.println(((ParameterizedType)type).getActualTypeArguments()[0]);//class java.lang.Integer } type = Test.class.getGenericSuperclass(); //ignore null check and cast check System.out.println(((ParameterizedType)type).getActualTypeArguments()[0]);//class java.lang.String Method method = Test.class.getDeclaredMethod("test", List.class); type = method.getGenericParameterTypes()[0]; //ignore null check and cast check System.out.println(((ParameterizedType)type).getActualTypeArguments()[0]);//class java.lang.Float } }
通过bytecode插件可以看到如下字节码:
// access flags 0x21 // signature Ljava/util/ArrayList<Ljava/lang/String;>; // declaration: com/chega/Test extends java.util.ArrayList<java.lang.String> public class com/chega/Test extends java/util/ArrayList // access flags 0x0 // signature Ljava/util/List<Ljava/lang/Integer;>; // declaration: java.util.List<java.lang.Integer> Ljava/util/List; d // access flags 0x2 // signature (Ljava/util/List<Ljava/lang/Float;>;)V // declaration: void test(java.util.List<java.lang.Float>) private test(Ljava/util/List;)V
就是因为字节码中保存了泛型信息,才能通过反射得到。
上一篇: 转一篇泛型介绍不错的文章
下一篇: 在Struts 2中实现文件上传