2014-01-27 4 views
2

Я хотел бы узнать, как я могу создать ArrayList методов.Ясность о методах и ArrayList

public class a { 
public static b(){} 
public static c(){} 
public static d(){} 
public static e(){} 

public static void main(String[] arg){ 
ArrayList<Method> lst = new ArrayList<Method>(); 
lst.add(1, a()); 
lst.add(2, b()); 
lst.add(3, c()); 
lst.add(4, d()); 
lst.add(5, e()); 
} 

Я задаюсь вопросом, почему это будет нравится, кто-то может быть так любезны объяснить:

public static Collection<? extends Method> a(){} 
... 
lst.addAll(1, a()); 

Почему с помощью коллекции? Почему бы не просто добавить (объект)?

О, еще одна вещь. Как я могу выполнить более поздние методы из ArrayList?

for (Method i : lst){ 
i;} 

Благодарим за помощь.

+1

Здесь уже есть несколько правильных ответов, но я просто подумал, что буду комментировать, что это будет работать фантастически для вас, если производительность не будет проблемой. Показано, что использование Java Reflection на три порядка медленнее, чем фактические вызовы методов для реальных объектов. Если вы столкнулись с проблемами производительности, вы можете подумать о разработке интерфейса, который определяет методы, которые вы ожидаете вызывать, а затем обертывания любых объектов, которые вы хотите вызвать, в экземплярах этого интерфейса. Если производительность не является проблемой, похоже, что вы все поняли! – CodeBlind

ответ

3

Если вы хотите использовать отражение, вы должны использовать getDeclaredMethod, чтобы получить метод, как многие другие ответы здесь.Однако чаще (и, возможно, уборщик) практика в Java коде, чтобы избежать использования отражения, чтобы сделать интерфейс, который вы можете предоставить реализацию:

private static interface Foo { 
    public void doFoo(); 
} 

public static Foo a = new Foo() { 
    public void doFoo() { 
    // Do 'a' stuff here. 
    } 
} 

public static Foo b = new Foo() { 
    public void doFoo() { 
    // Do 'b' stuff here. 
    } 
} 

... 

public static Foo e = new Foo() { 
    public void doFoo() { 
    // Do 'e' stuff here. 
    } 
} 

public static void main(String[] arg){ 
    ArrayList<Foo> lst = new ArrayList<Foo>(); 
    lst.add(1, a); 
    lst.add(2, b); 
    lst.add(3, c); 
    lst.add(4, d); 
    lst.add(5, e); 
} 

Тогда для вызова функции, вы можете вызвать doFoo() на каждый из Foo объектов в списке.

1

Вы получаете объекты метода, используя Reflection для объекта класса.

И затем вы вызываете их, поставляя объект, который хотите, чтобы они действовали, плюс любые параметры, которые вы хотите предоставить.

Вероятно, это хорошая идея, чтобы прочитать отражение учебника: http://docs.oracle.com/javase/tutorial/reflect/

1

Вы можете получить метод, объявленный в классе, как это:

public class MyClass { 
    public void a() { 
     System.out.println("A!"); 
    } 

    public static void main(String... args) 
    { 
     Method methodA = getClass().getDeclaredMethod("a"); 
    } 
} 
1
  • Вы должны иметь тип возвращаемого значения для всех методы (за исключением конструкторов), таких как public static void b(){}.
  • lst.add(1, a()); просто вызовет метод и попытается добавить возвращаемое значение метода в список по заданному индексу.
  • Кроме того, вы должны следовать соглашениям Java Naming (например, имя класса должен всегда начинается с капиталом)

Если на все, что вы хотите добавить Method вам нужно использовать отражение list.add(a.class.getMethod("b"));

2

По состоянию на Java 7, вы не можете рассматривать метод как переменную, как вы здесь делаете. Вам нужно использовать Reflection для доступа к объекту Method, который представляет этот метод. Используйте getMethod method на классе a, чтобы получить нужный Method объект, который вы можете add на ArrayList.

addAll method добавляет все элементы в аргументе коллекции в коллекцию, по которой вы звоните addAll. Если бы вы звонили add(Collection), то сам Collection был бы следующим новым элементом.

Чтобы позвонить методу, представленному Method, позвоните по телефону invoke method. Осторожно, как методы getMethod, так и invoke бросают свои собственные Exception, которые вам придется поймать.

Смежные вопросы