2012-08-03 47 views
2

Java中有反映局部变量类型的方法吗?我知道你对此有信心 - Get generic type of java.util.List。不知道如何解决,例如:运行时局部变量的一般类型

public void foo(List<String> s){ 
    //reflect s somehow to get String 
} 

甚至更​​普遍的:

public void foo<T>(List<T> s){ 
    //reflect s somehow to get T 
} 
+0

你到底想用s完成什么?你能告诉我一个简单的例子(伪代码无关紧要) – 2012-08-03 16:00:59

+0

有了泛型,你可以做一些类似于public void foo T>(List s),如果这就是你想要的 – 2012-08-03 16:02:56

回答

1

Here是很好的教程,它展示了如何以及何时使用反射来读取泛型。例如,从您的冷杉获取字符串foo方法

public void foo(List<String> s) { 
    // .. 
} 

您可以使用此代码

class MyClass { 

    public static void foo(List<String> s) { 
     // .. 
    } 

    public static void main(String[] args) throws Exception { 
     Method method = MyClass.class.getMethod("foo", List.class); 

     Type[] genericParameterTypes = method.getGenericParameterTypes(); 

     for (Type genericParameterType : genericParameterTypes) { 
      if (genericParameterType instanceof ParameterizedType) { 
       ParameterizedType aType = (ParameterizedType) genericParameterType; 
       Type[] parameterArgTypes = aType.getActualTypeArguments(); 
       for (Type parameterArgType : parameterArgTypes) { 
        Class parameterArgClass = (Class) parameterArgType; 
        System.out.println("parameterArgClass = " 
          + parameterArgClass); 
       } 
      } 
     } 
    } 
} 

输出:parameterArgClass =类java.lang.String

这是可能的,因为你的在源代码中明确声明List只能包含字符串。然而,在案件

public <T> void foo2(List<T> s){ 
     //reflect s somehow to get T 
} 

T可以是任何东西,是因为类型擦除是不可能的检索提供精准的T类信息。

6

没有。由于Java的Type Erasure,所有泛型在编译过程中被剥离。

但是,您可以在列表中的元素上使用instanceOfgetClass以查看它们是否与特定类型匹配。

+1

但是你仍然可以做在该领域同样的事情,所以信息存储在某处... – Bober02 2012-08-03 15:52:25

+1

字段是不同的,因为它们的确切泛型类型静态存储在类文件中。约翰是正确的:你不能这样做。 – 2012-08-03 15:55:52