2011-01-24 7 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.. 
      } 
     } 
    } 

} 
 

I가 실제로) callAll (행 4 개 메소드 호출에 문제가있는, 즉 반사를 사용하지 않는다. 그러나 제 동료 중 한 명은 50 가지 방법이 있다면 무엇을 하나씩 부르겠습니까? 나는 그것에 대한 대답이 없다. 그래서 나는 여기서 질문한다.

감사합니다, 사라

+3

왜 그렇게하고 싶습니까? – finnw

+1

일부 코드를 보여 주시겠습니까? 왜냐하면 당신이 성취하고자하는 것을 이해하는데 어려움이 있기 때문입니다. –

+0

@finnw, 내 질문을 업데이트했습니다.실제로 저는 동료에게 "왜 그렇게하고 싶습니까?"라는 점을 증명하려고 노력하고 있습니다. 그래서 나는 여기서 질문을하고 있습니다. – sarahTheButterFly

답변

1

나는 아무것도 당신이 궁극적으로 어쨌든 반사 졸이다 것입니다 일을 끝낼 것을 확신; 예 : 양상, DI 등. 그래서 나는 이득이 무엇인지 알지 못한다.

+0

안녕하세요, 양상 및 DI에 대한 정보 나 링크를 제공해 주시겠습니까? – Greenhorn

+0

잊어 버리십시오. 여기서는 관련이 없습니다 (그러나 Wiki 또는 Google, DI = 종속성 주입 시도). 반사는 방법을 열거 할 수있는 방법입니다. 예를 들어 cglib을 사용하여 클래스 파일을 분석 할 수 있지만 더 좋을 것 같지 않습니다. 다른 사람들처럼, 나는 왜 당신이 그것을 원하니? – maaartinus

+0

@Greenhorn, 관련 여부 [here you go] (http://java.dzone.com/articles/dependency-injection-an-introd). – javamonkey79

1

callAll() 메서드를 실제로 리플렉션없이 명시 적으로 각 메서드를 호출하도록 작성합니다.

이렇게하면 하위 클래스를 융통성있게 사용할 수 있습니다. 또한 매개 변수가있는 메소드를 처리 할 수 ​​있습니다. 또한 적용되지 않는 방법을 건너 뛸 수 있습니다. 가장 중요한 것은 요구 사항이 변경되고이 담요 규칙이 더 이상 적용되지 않으면 코드를 변경하는 것이 매우 쉽습니다.

"클래스의 모든 메소드 호출"은 유효한 유스 케이스가 아닙니다. JUnit이 테스트 케이스를 수행하기 위해 "test"로 시작하는 인수없이 모든 메소드를 호출하는 것을 보았습니다. 그것이 내가 가졌던 가장 가까운 것입니다. 그리고 만약 당신의 목표가 이것과 비슷한 것을하는 것이라면, 당신은 올바른 길을 가고 있습니다. 이런 식으로 일하고 있다면, 나는 반성에 대한 대안을 찾고 있다고 생각하지 않는다.

+1

Junit4는 @Test 메소드를 필터링하기 위해 java.lang.reflect.Method.getAnnotation (Class )! = null을 사용하므로 반영됩니다. –

5

실제로는 Class.getDeclaredMethods()을 사용하고 싶을 것입니다. Class.getMethods()은 공용 메소드 만 반환하며 사용자가 표시하는 메소드는 public이 아니며 수퍼 클래스에서 상속 된 public 메소드도 반환합니다.

그렇습니다 : 언급 한 시나리오에서 리플렉션은 유효한 접근 방식입니다. 다른 모든 (수동) 방법은 오류가 발생하기 쉽습니다.

그러나 명명 규칙을 사용하는 것은 경비원으로서 나에게 약한 것처럼 보입니다. 커스텀 어노테이션을 작성하고, 존재한다면,이 메소드를 실행할 것이다. 예 : 여기

@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

난 그냥 빨리이 문제를 접근하는 자바 방법을 써서 어떤 이유로 생각했다. 분명히 그것은 장황하고 OOP 기반입니다.

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(); 
} 
관련 문제