2017-11-13 20 views
1

모든 매개 변수를 매개 변수로 허용하는 제네릭 메서드가 있습니다.
예를 들어, 메서드에 대한 호출을 매개 변수로 'String'유형으로 만 일치시키는 pointcut을 원합니다. 궁극적으로 요구 사항은 권고가 'String'매개 변수로 실행되는 범위를 제한하는 것입니다.AspecJ - 일반 매개 변수가있는 메서드와 일치하는 pointcut

public class Param<T> { 
    public T execute(T s){ 
     return s; 
    } 
} 

Main 클래스 :

은 여기 내 일반적인 클래스와 방법 내 애플 부울 및 매개 변수로 문자열 모두이 방법으로 호출합니다.

public static void main(String[] args) { 
    Param<String> sp = new Param<String>(); 
    String rs = sp.execute("myString"); //want a joint point 

    Param<Boolean> bp = new Param<Boolean>(); 
    Boolean rb = bp.execute(true); //dont want a joint point 
} 

아래의 포인트 컷은 String 및 Boolean 매개 변수 모두에 유효합니다 (실제로 모든 유형에서 작동). 하지만 매개 변수가 String 유형 인 경우에만 메서드 호출을 가로 채기위한 pointcut을 원합니다. 사람 아래

@Pointcut("call(* com.amazon.auiqa.aspectj.generics.Param.execute(**))") 
void param(){} 

@Pointcut("execution(Object com.amazon.auiqa.aspectj.generics.Param.execute(Object))") 
void param(){} 

나를 위해 작동하지 않았다 : 내가 여기에 달성하기 위해 원하는 것을 달성 할 수있는 경우 궁금 해서요

@Pointcut("execution(String com.amazon.auiqa.aspectj.generics.Param.execute(String))") 
@Pointcut("call(String com.amazon.auiqa.aspectj.generics.Param.execute(String))") 

. 메서드 반환 형식을 사용하여 동일한 작업을 수행하고 싶습니다.

+0

상기는 유사하다 일례이다. 실제 문제는 내 셀렌 테스트에 있습니다. 여러 가지 유형의 WebDriverWait.unitl (..) 호출이 있습니다. 예 : 'WebElement 요소 = new WebDriverWait (driver, timeOut) .until (ExpectedConditions.visibilityOfElementLocated (locator))); (ExpectedConditions.textToBePresentInElement (someElement, "someText")) .until 부울 isPresent = 새로운 WebDriverWait (드라이버, 제한 시간)' 나는 WebElment을 반환 단지 사람을 캡처하고 싶습니다. –

답변

0

AspectJ를 가진 않으며, 실제로 컴파일 된 바이트 코드에서 삭제됩니다 제네릭 형식 정보와 같은 다른 바이트 코드 조작 라이브러리 (자바 9로), 그래서 당신의 일반적인 방법은 public Object execute(Object s)이되는 것을 당신은 T은 억제 할 수있는 유형의 인수 이후, 할 수 없어 . 자세한 내용은 Java 설명서의 Type Erasure을 참조하십시오.

원본 메서드 시그니처가 메타 데이터 형식으로 유지되는 동안 컴파일러는 제네릭 코드에 대해 컴파일하는 동안 형식 경계가 존중되는지 여부를 확인할 수 있지만 어떤 방식 으로든 제네릭 형식 인수를 결정하는 데 도움이되지 않습니다. 그 클래스의 인스턴스는 그 정보가 전혀 존재하지 않기 때문에 인스턴스화되었다.

0

Java 삭제에 대해 언급 한 다른 게시 내용은 사실입니다.

AspectJ 5에서는 포인트 컷 식과 형식 패턴에서 형식 변수를 사용할 수 없습니다. 대신 형식 매개 변수를 서명의 일부로 사용하는 멤버는 지우는 것과 일치시킵니다. Java 5는 다음과 같이 유형의 삭제를 결정하기위한 규칙을 정의합니다.

|T|은 일부 유형의 삭제를 나타냅니다. T. 그러면 :

  • T<T1,...,Tn>|T|있는 파라미터 화 된 형태의 소거. 예를 들어, List<String>의 지우기는 List입니다.

  • 중첩 된 유형 T.C의 삭제는 |T|.C입니다. 예를 들어 중첩 된 유형 Foo<T>.Bar의 지우기는 Foo.Bar입니다.

  • 어레이 유형 지우기는 T[]입니다. T|[]. 예를 들어, List<String>[]의 지우기는 List[]입니다.

  • 유형 변수의 지우기는 가장 왼쪽 경계입니다. 예를 들어, 타입 변수 P의 삭제는 Object이고 타입 변수 N extends Number의 삭제는 Number입니다.

당신은 here보다 자세한 내용을보실 수 있습니다. Param

  1. 캡처 모든 execute 메소드 실행 :

    그러나, 당신은 다음을 수행 할 수 있습니다.

  2. String 인수의 요구 사항을 instanceof을 사용하여 인수 유형별로 필터링하십시오.

일반 사항을 나타내려면 더하기 기호 (+)가 필요합니다. 여기

@Component 
@Aspect 
public class ParamAspect { 

    @Pointcut("execution(public * com.amazon.auiqa.aspectj.generics.Param+.execute(..))") 
    public void pointcut() { 
    } 

    @Before("pointcut()") 
    public void intercept(JoinPoint jp) { 
     System.out.println(
       "Entering class: " + jp.getSignature().getDeclaringTypeName() + 
         " - before method: " + jp.getSignature().getName()); 

     // check for argument type of String 
     Object[] args = jp.getArgs(); 
     if (args.length == 1) { 
      if (args[0] instanceof String) { 
       System.out.println("1. parameter type is string"); 
      } else { 
       System.out.println("2. parameter type is not string"); 
      } 
     } 
    } 
} 
+0

자세한 설명을 주셔서 감사합니다. 도와 줘요! 'instanceof'는 지금 조언 실행을 필터링하는 데 사용하고 있습니다. –