2011-01-24 2 views
2

У меня есть класс, который имеет метод, который вызывает все остальные методы в одном классе.Вызов всех методов в классе

Один из способов сделать это с помощью рамки отражения, есть ли другие способы?

[править] Примером код добавлен:

 

import java.lang.reflect.InvocationTargetException; 
import java.lang.reflect.Method; 


public class AClass { 

    private void aMethod(){ 

    } 

    private void bMethod(){ 

    } 

    private void cMethod(){ 

    } 

    private void dMethod(){ 

    } 

    //50 more methods. 

    //method call the rest 
    public void callAll() throws IllegalArgumentException, IllegalAccessException, InvocationTargetException{ 
     Method[] methods = this.getClass().getMethods(); 
     for (Method m : methods) { 
      if (m.getName().endsWith("Method")) { 
       //do stuff.. 
      } 
     } 
    } 

} 
 

Я на самом деле не имеет проблем с вызовом все 4 методов из callAll(), т.е. избегать использования отражения. Но один из моих коллег отметил, что, если есть 50 методов, вы будете называть их один за другим? У меня нет ответа на это, поэтому я задаю этот вопрос здесь.

Спасибо, Сара

+3

Зачем вам это нужно? – finnw

+1

Не могли бы вы показать код? Потому что мне трудно понять, чего вы пытаетесь достичь. –

+0

@finnw, я обновил свой вопрос.На самом деле я пытаюсь доказать свою точку зрения «Зачем вам это делать» коллеге, поэтому я задаю здесь вопрос. – sarahTheButterFly

ответ

1

Я уверен, что все, что вы в конечном итоге делает собирается в конечном счете, сводится к отражению в любом случае; например: аспекты, DI и т. д. Поэтому я не знаю, какой будет выигрыш - удобство может быть?

+0

Эй, можете ли вы дать некоторую информацию или ссылки об аспектах и ​​DI? – Greenhorn

+0

Забудьте об этом, здесь это не актуально (но попробуйте Wiki или Google, DI = инъекция зависимостей здесь). Отражение - это способ, как методы могут быть перечислены. Вы могли бы проанализировать файл класса вместо этого, например, cglib, но я не уверен, что это будет лучше. Как и все остальные, я спрашиваю: «Почему ты этого хочешь»? – maaartinus

+0

@ Greenhorn, релевантный или нет [здесь вы идете] (http://java.dzone.com/articles/dependency-injection-an-introd). – javamonkey79

1

Напишите метод callAll(), чтобы фактически вызвать каждый метод явно без отражения.

Это позволяет обеспечить гибкость в подклассе. Это также позволяет вам иметь дело с методами, которые имеют параметры. Он также позволяет обойти методы, которые не применяются. Самое главное, это очень упрощает изменение вашего кода при изменении требований, и это правило одеяла больше не применяется.

«Вызов всех методов в классе» не является действительным прецедентом. Я видел, что JUnit вызывает все методы без аргументов, начинающихся с «теста», чтобы делать тестовые примеры. Это самое близкое, что я пришел, и если ваша цель - сделать что-то подобное, то вы на правильном пути. Если бы вы работали над чем-то подобным, я не думаю, что вы искали альтернативы размышлению.

+1

Junit4 использует java.lang.reflect.Method.getAnnotation (класс )! = Null, чтобы фильтровать методы @Test, поэтому он также отражает. –

5

Собственно, вы, вероятно, захотите использовать Class.getDeclaredMethods(). Class.getMethods() возвращает только общедоступные методы, и ни один из методов, которые вы показываете, не является общедоступным (и он также возвращает общедоступные методы, унаследованные от суперклассов).

Это сказало: В упомянутом вами сценарии отражение является действительным подходом. Все другие (ручные) подходы были бы подвержены ошибкам.

Однако использование соглашения об именах кажется мне слабым как охранник. Я бы написал пользовательскую аннотацию, и если она присутствует, я бы выполнил этот метод. Пример:

@Retention(RetentionPolicy.RUNTIME) 
@Target(ElementType.METHOD) 
public @interface RunMe {} 

А вот ваш измененный код:

public void callAll() throws 
IllegalArgumentException, IllegalAccessException, InvocationTargetException{ 
    Method[] methods = this.getClass().getDeclaredMethods(); 
    for (Method m : methods) { 
     if (m.getAnnotation(RunMe.class)!=null) { 
      //do stuff.. 
     } 
    } 
} 
0

Я просто подумал, что по какой-то причине, я быстро пишу путь Java приближающихся этой проблемы. Очевидно, что это подробный и основанный на ООП.

Поскольку мы не можем использовать указатели на методы в Java, мы должны создавать объекты, которые имеют методы, а затем называть их. Вы всегда можете изменить метод даже для произвольного количества произвольных аргументов и т. Д.

import java.lang.reflect.InvocationTargetException; 
import java.lang.reflect.Method; 


public class AClass { 

    private List<Method> methods = new LinkedList<>(); 

    methods.push(new Method() 
    { 
    private void callMethod(){ 
     //method A 
    } 
    }); 

    methods.push(new Method() 
    { 
    private void callMethod(){ 
     //method B 
    } 
    }); 

    methods.push(new Method() 
    { 
    private void callMethod(){ 
     //method C 
    } 
    }); 

    //50 more methods. 

    //method call the rest 
    public void callAll() 
    { 
    for (Method method : methods) { 
     method.callMethod(); 
    } 
    } 
} 

public interface Method 
{ 
    void callMethod(); 
} 
Смежные вопросы