2010-07-02 8 views
4

이렇게 : 클래스에는 sayHello()라는 메소드가 있습니다. 클래스의 인스턴스가 sayHello()를 호출하면 sayHello()가 호출되기 전에 다른 클래스의 메소드가 자동으로 호출됩니다.메소드를 호출하기 전에 메소드를 수동으로 호출하는 방법

샘플 코드는 다음과 같이 할 수있다 :

public class Robot{ 
    public static void doSomethingBefore(){ 
     System.out.println("Do something before sayHello"); 
    } 

} 


public class Person { 

    public void sayHello(){ 
      System.out.println("hello"); 
    } 

    public static void main(String[] args){ 
      Person p = new Person(); 
      p.sayHello(); 
    } 
} 

출력 결과 :

Do something before sayHello 
hello 

이 프록시 패턴을 사용하여 수행 할 수 있습니다 보인다. 그러나 나는 그것이 더 간단 할 수 있기를 바란다.

사용 주석 :

@Retention(RetentionPolicy.RUNTIME) 
@Target({ElementType.METHOD}) 
public @interface MethodListener { 
     public String className(); 
     public String methodName(); 
} 

그런 다음, Person 클래스의 메소드의 sayHello()에 MethodListener 주석을 넣어 MethodListener 주석이있는 방법은 호출 될

public class Person { 
    @MethodListener(className="Robot",methodName="doSomethingBefore") 
    public void sayHello(){ 
     System.out.println("hello"); 
    } 

    public static void main(String[] args){ 
     Person p = new Person(); 
     p.sayHello(); 
    } 
} 

doSomethingBefore() 메소드는 자동으로 호출됩니다.

가능하면 할 수 있습니까? 어떻게 할 수 있습니까?

답변

2

AspectJ, JBoss AOP 또는 Spring AOP와 같은 aspect 지향 프로그래밍 프레임 워크를 찾고 있다고 생각합니다.

Robot 메서드에 의한 Person 메서드의 장식은 Person 인스턴스의 생성 중에 발생하지만 new 대신 AOP 컨테이너에서 제공하는 팩토리 클래스를 사용해야합니다.

3

체크 AspectJ 및 애스펙트 지향 프로그래밍 프레임 워크. 그것은 당신이 비슷한 것을 할 수있게 해줄 것입니다.

이 상황이 발생하게하려면 클래스를 개체를 인스턴스화하고 프록시를 만드는 컨테이너에서 관리해야합니다.

AspectJ에는 VM에 "마법"을 연결하여 사용할 수있는 대안이 있습니다.

관련 문제