2014-01-08 4 views
0

다음과 같은 특징이 있습니다.메소드에 매개 변수를 추가 하시겠습니까?

@Around("somePublicMethod()") 
    public Object doAction(ProceedingJoinPoint call) throws Throwable { 
     SomeObject client = null; 
     Object result = null; 

     try 
     { 
      client = someDao.getResult(); 


      Object[] allArgs = call.getArgs(); 
      allArgs[allArgs.length-1] = client; 

      // Do the call, passing in the managed SiperianClientWrapper 
      result = call.proceed(allArgs); 
     } 
     catch(Exception ex) 
     { 

      throw ex; 
     } 

다음과 같은 서비스 방법이 있습니다. 이 방법은 위의 요격에 의해 가로 채어진다.

public SomeEntity getEntities(String name, String pwd, SomeObject client){ 

//some logic 


} 

위의 방법은 아래와 같이 호출된다. 무엇 인 양태

someService.getEntities("name","pwd",null); 

는 SomeObject의 널 갖고 널 일부 실제 값으로 대체된다.

제 질문은 null을 매개 변수 값으로 전달하는 대신, Aspect에서 Reflection을 사용하여 추가 매개 변수를 추가 할 수 있습니까? 내 경우에는 SomeObject 매개 변수를 동적으로 추가 할 수 있습니까?

그래서 마지막으로 서비스를 someService.getEntities("name","pwd");으로 호출해야하며 SomeObject는 Aspect에 의해 동적으로 추가됩니까?

감사합니다. 자바 파일이

public SomeEntity getEntities(String name, String pwd, SomeObject client){ 

등의 방법 선언으로 선언 된 경우

답변

0

은 그 당신이 사용해야 할 것입니다.

someService.getEntities("name","pwd"); 

과 같은 메서드 호출은 컴파일되지 않습니다.

리플렉션은 컴파일 된 바이트 코드를 변경할 수 없습니다.

처음 두 인수 만 사용하여 리플렉션을 통해이 메소드를 호출하면 IllegalArgumentException이됩니다.

+0

Sotirios, 답변을 주셔서 감사합니다. 3 대신에 2 개의 인수를 받아들이도록 getEntities 메소드의 서명을 변경합니다. 이제 여분의 메서드 매개 변수를 하나 더 추가 할 수 있습니까? 아니면 SomeObject 런타임을 삽입 할 수있는 방법이 있습니까? – user755806

+0

@ user755806 메소드가 컴파일됩니다. 런타임에는 서명을 변경할 수 없습니다. varargs로 메소드를 선언하면 런타임에 더 많은 인수를 전달할 수 있습니다. –

0

javac 컴파일러가 컴파일되지 않기 때문에 ajc 컴파일러를 사용하려는 경우 extend class 일 수 있으며 오버로드 방법이 가능합니다. 온라인 리소스는 부족하지만, AspecJ in Action은이 주제를 공부하는 데 유용한 리소스 여야합니다.

관련 문제