Java反射 - 在一个ArrayList中传递作为参数的方法调用(Java Reflection

2019-07-05 07:08发布

想的ArrayList类型的参数传递到方法,我去调用。

我打了一些语法错误,所以我想知道什么是错的这是什么。

方案1:

// i have a class called AW
class AW{}

// i would like to pass it an ArrayList of AW to a method I am invoking
// But i can AW is not a variable
Method onLoaded = SomeClass.class.getMethod("someMethod",  ArrayList<AW>.class );
Method onLoaded = SomeClass.class.getMethod("someMethod",  new Class[]{ArrayList<AnswerWrapper>.class}  );

方案2(不一样的,但类似):

// I am passing it as a variable to GSON, same syntax error
ArrayList<AW> answers = gson.fromJson(json.toString(), ArrayList<AW>.class);

Answer 1:

你的(主)的错误是不必要的传递泛型类型AW您的getMethod()的参数。 我试着写一个简单的代码,类似于你的,但工作。 希望它可以解答您的莫名其妙的问题(一些):

import java.util.ArrayList;
import java.lang.reflect.Method;

public class ReflectionTest {

  public static void main(String[] args) {
    try {
      Method onLoaded = SomeClass.class.getMethod("someMethod",  ArrayList.class );
      Method onLoaded2 = SomeClass.class.getMethod("someMethod",  new Class[]{ArrayList.class}  );    

      SomeClass someClass = new SomeClass();
      ArrayList<AW> list = new ArrayList<AW>();
      list.add(new AW());
      list.add(new AW());
      onLoaded.invoke(someClass, list); // List size : 2

      list.add(new AW());
      onLoaded2.invoke(someClass, list); // List size : 3

    } catch (Exception ex) {
      ex.printStackTrace();
    }
  }

}

class AW{}

class SomeClass{

  public void someMethod(ArrayList<AW> list) {
    int size = (list != null) ? list.size() : 0;  
    System.out.println("List size : " + size);
  }

}


Answer 2:

类文字不以这种方式参数化,但幸运的是,你并不需要它。 由于擦除,只会有有一个ArrayList作为参数(你不能在泛型重载)一个方法,所以你可以只使用ArrayList.class并得到正确的方法。

对于GSON,他们引进了TypeToken类来处理的事实,类文字不表达仿制药。



文章来源: Java Reflection - Passing in a ArrayList as argument for the method to be invoked