欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

java泛型 java泛型

程序员文章站 2022-04-05 12:57:49
...
参考:http://blog.csdn.net/lonelyroamer/article/details/7868820

文章参考上面的链接。下面是个人总结:
泛型信息在编译后即被擦除,但是泛型信息会被写入到.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

就是因为字节码中保存了泛型信息,才能通过反射得到。
相关标签: java 泛型