Invokable.getReturnType():无法从官方维基重现Guava的例子

时间:2015-02-26 16:09:26

标签: java reflection guava

official Guava's TypeToken wiki中,有以下示例:

Invokable<List<String>, ?> invokable = new TypeToken<List<String>>() {}.method(getMethod);
invokable.getReturnType(); // String.class

如何设置getMethod

我尝试了以下示例:

  1. 首先尝试:

    List<String> list = new ArrayList<String>();
    Class[] arg = { int.class };
    Method getMethod = list.getClass().getMethod("get", arg);
    Invokable<List<String>, ?> invokable = new TypeToken<List<String>>() {}.method(getMethod);
    System.out.println(invokable.getReturnType());
    

    它崩溃了以下消息:

    Exception in thread "main" java.lang.IllegalArgumentException: public java.lang.Object java.util.ArrayList.get(int) not declared by java.util.List<java.lang.String>
        at com.google.common.base.Preconditions.checkArgument(Preconditions.java:145)
        at com.google.common.reflect.TypeToken.method(TypeToken.java:495)
        at tmp.LaunchClass.main(LaunchClass.java:28)
    
  2. 第二次尝试(尽管有点不同):

    List<String> list = new ArrayList<String>();
    Class[] arg = { int.class };
    Method getMethod = list.getClass().getMethod("get", arg);
    // changed here
    Invokable invokable = TypeToken.of(list.getClass()).method(getMethod);
    System.out.println(invokable.getReturnType());
    

    不会崩溃,但不会返回预期结果。退回E。预期结果:String.class(如在官方维基中)。

1 个答案:

答案 0 :(得分:3)

您正试图从get获取方法ArrayList。你应该从List获得它。

Class<?> clazz = List.class;
Method getMethod = clazz.getMethod("get", int.class);

TypeToken#method(Method)州的javadoc

  

返回Invokable的{​​{1}},method必须是T的成员。

其中TTypeToken中声明的类型变量。