2016-03-04 75 views
1

编辑:对不起,我提供下面的例子不会重现问题...我试图找到正确的方式来重现它。在此之前,你可以不理会我的问题...反射无法获得覆盖泛型类型接口的方法的实际参数类型?

通常我们抢的方法的参数类型是这样的:

Class<?> clazz = method.getParameterTypes()[0] 

我从来没有想过而后行之前,但最近我碰到了这个问题我总是得到class java.lang.Object。检查后,我发现的情况下可以这样描述:

/** A parameterized interface */ 
public interface IService<T> { 

    Result create(T obj); 
} 

/** An implementation */ 
public class CarService implements IService<Car> { 

    public Result create(Car car) { ... } 
} 

,然后当我使用上面的方法来获取类的参数car的,它原来是一个class java.lang.Object

Method methods = CarService.class.getMethods(); 
for (Method method : methods) { 
    Class<?>[] types = method.getParameterTypes(); 
    // when the loop meets "create" here ... 
} 

我想我完全忘记了关于类型擦除的一些非常基本的东西?但现在我真的需要得到这种情况下的实际参数类型,如果可能的话...

+0

尝试'method.getGenericParameterTypes()'而不是'方法.getParameterTypes()' – Ferrybig

回答

2

是的,这是类型擦除令人讨厌。

class Car {} 
interface IService<T> { 
    void create(T obj); 
} 

class CarService implements IService<Car> { 
    public void create(Car car) {} 
} 

然后:

$ javac Test.java # Contains all the above... 
$ javap -c CarService 

Compiled from "Test.java" 
class CarService implements IService<Car> { 
    CarService(); 
    Code: 
     0: aload_0 
     1: invokespecial #1     // Method java/lang/Object."<init>":()V 
     4: return 

    public void create(Car); 
    Code: 
     0: return 

    public void create(java.lang.Object); 
    Code: 
     0: aload_0 
     1: aload_1 
     2: checkcast  #2     // class Car 
     5: invokevirtual #3     // Method create:(LCar;)V 
     8: return 
} 

而这些都是当您使用反射出

public class Test { 
    public static void main(String[] args) { 
     Method[] methods = CarService.class.getDeclaredMethods(); 
     for (Method method : methods) { 
      System.out.println(method.getName()); 
      for (Class<?> type : method.getParameterTypes()) { 
       System.out.printf("- %s%n", type.getName()); 
      } 
     } 
    } 
} 

输出:

你在字节码到这里值得看
create 
- Car 
create 
- java.lang.Object 

如何使用这将取决于你想要达到的目标,但希望知道在字节码中有多种方法将有助于...

+0

谢谢!两个同名的方法......这使我认为我在问题中提供的例子并不是在第一个地方重现问题。我需要一个简单的“if”来解决这个问题。 – fwonce