2014-09-11 5 views
1

HBase에서 무언가를 얻으려고합니다 .AspectJ의로드 시간 짜기를 사용합니다. AbstractAspect.aj과 aop.xml을 작성했습니다. 또한 aop.xml을 생성하기 위해 "ajc -outxml AbstractAspect.aj"를 사용해 보았습니다. 너무 간단하고 메서드의 매개 변수를 얻을 수 없습니다. 나는 방법 (LTW) 컨텍스트를 얻을 수 있는지 의심 스럽네.로드 시간 짜기 (AspectJ)를 사용하여 매개 변수를 가져올 때 aop.xml을 구성하는 방법은 무엇입니까?

AbstractAspect.aj :

package com.test.apectj.aj; 

import org.apache.hadoop.hbase.protobuf.generated.ClientProtos.GetRequest; 
import com.google.protobuf.RpcController; 

public abstract aspect AbstractAspect { 

    pointcut scan(); 

    pointcut multi(); 

    pointcut getdata(final RpcController controller, final GetRequest request): target(org.apache.hadoop.hbase.protobuf.generated.ClientProtos) && call (public * org.apache.hadoop.hbase.regionserver.HRegionServer.get(RpcController, GetRequest)) && args(controller, request); 

    pointcut scope(); 

    before() : scan() { 
     System.out.println("[aop]before methon scan()"); 
     System.out.println(thisEnclosingJoinPointStaticPart); 
     System.out.println(thisJoinPoint.getSourceLocation()); 
    } 

    before() : multi() { 
     System.out.println("[aop]before methon multi()"); 
     System.out.println("[aop]Execute multiple actions on a table: get,       
          mutate,and/orexecCoprocessor"); 
    } 

    after() : multi(){ 
     System.out.println("[aop]after methon multi()"); 
    } 

    before(RpcController controller, GetRequest request) : getdata(controller, request)     
    { 

     System.out.println("[aop]before methon get()"); 
     System.out.println("[aop]Get data from a table"); 
     System.out.println(request.toString()); 
    } 

} 

aop.xml :

<?xml version="1.0" encoding="UTF-8"?> 
    <aspectj> 
     <aspects> 
      <concrete-aspect name="com.test.apectj.aj.ConcreteAspect" 
       extends="com.test.apectj.aj.AbstractAspect"> 
       <pointcut name="scan" 
        expression="execution(public * org.apache.hadoop.hbase.regionserver.HRegionServer.scan(com.google.protobuf.RpcController, org.apache.hadoop.hbase.protobuf.generated.ClientProtos.ScanRequest)) AND target(org.apache.hadoop.hbase.regionserver.HRegionServer)" /> 
       <pointcut name="multi" 
        expression="execution(public * org.apache.hadoop.hbase.regionserver.HRegionServer.multi(..)) AND target(org.apache.hadoop.hbase.regionserver.HRegionServer)" /> 
       <pointcut name="getdata()" 
        expression="call(public * org.apache.hadoop.hbase.regionserver.HRegionServer.get(..))" /> 
      </concrete-aspect> 
     </aspects> 


     <weaver options="-verbose -Xset:weaveJavaxPackages=true"> 
     </weaver> 

    </aspectj> 

러닝

  • 인수를 [포인트 컷 : 주사() 다중() ] : 성공. 정보를 인쇄 할 수 있습니다.
  • 에는 인수 [pointcut : getdata()] : 실패가 있습니다. 다음과 같이 경고 : ...이 메커니즘을 사용할 때 첨부 : 추상적없는 경우
[[email protected]] warning at com/test/apectj/aj/E:\EclipseWorkspace\hbase-regionserver-aop\src\com\test\apectj\aj\AbstractAspect.aj:25::0 does not match because declaring type is org.apache.hadoop.hbase.protobuf.generated.ClientProtos$ClientService$BlockingInterface, if match desired use target(org.apache.hadoop.hbase.regionserver.HRegionServer) 
[Xlint:unmatchedSuperTypeInCall] 
see also: org/apache/hadoop/hbase/protobuf/generated/ClientProtos.java:28857::0 

만 간단한 추상 포인트 컷가 구현 될 수있다.

제 질문은이 방법으로 매개 변수를 가져올 수 있는지 여부입니다. 가능한 경우 구성 방법.

+0

좀 더 읽기 쉽게하기 위해 코드에 구문 강조를 추가했습니다. 그러나 철자법과 문법을 조금 더 조심하십시오. "aspect"대신 "apect"와 같은 패키지 이름을 사용하고 "method"대신 "methon"을 말하는 로그 메시지를 사용합니다. 당신은 많은 곳에서 완전한 문장을 쓰지 않으므로, 당신이 말하고자하는 것을 언외하기가 매우 어렵습니다. 제 제안은 더 많은 시간을 들여 이해하기 쉽도록하거나, 영어로 문제가 해결되지 않으면 회사 부서에서 누군가 도와 주어 문제를 해결하는 것입니다. – kriegaex

답변

1

귀하의 aop.xml은 두 개의 추상적 인 기본 애스펙트 포인트 컷 (scan()multi())에 대해 pointcut를 제공하는 구체적인 측면을 정의합니다. 여태까지는 그런대로 잘됐다. 그러나 pointcut getdata(final RpcController controller, final GetRequest request)으로 무엇을하려고합니까? 이미 매개 변수 바인딩뿐만 아니라 두 개의 매개 변수가있는 기본 측면에서 이미 구체적으로 정의되어 있습니다. 매개 변수없이 다른 대상을 사용하여 동일한 이름으로 다시 정의하려는 것 같습니다. 그건 이해가되지 않습니다. 그리고 매개 변수 바인딩을 직접 정의하고 기존 매개 변수를 덮어 쓰지 않는다면 매개 변수 바인딩을 어떻게 기대할 수 있습니까? 업데이트

: 대상 객체 : 당신이 도청 대상 방법 HRegionServer.get(..)와 대상 유형 ClientProtos을 비교하면

pointcut getdata(final RpcController controller, final GetRequest request): 
    target(org.apache.hadoop.hbase.protobuf.generated.ClientProtos) && 
    call (public * org.apache.hadoop.hbase.regionserver.HRegionServer.get(RpcController, GetRequest)) && 
    args(controller, request); 

, 당신은 모순이 있음을 참조하십시오 나는 경고 메시지의 의미를 언급하는 것을 잊었다 유형이 ClientProtos 일 수 없으므로 해당 클래스의 메소드를 가로 채고 있으므로 HRegionServer이어야합니다. AspectJ는 당신에게 그것을 말할만큼 충분히 친숙합니다.

논리적으로, 발신자 유형이 호출자 유형 다를 수 있기 때문에 this(Foo) && call(* Bar.blah(..))은 가능하지만 joinpoint를의 결과 세트는 항상 비어 있기 때문에 target(Foo) && call(* Bar.blah(..)) 인해 call(* Bar.blah(..))이 항상 대상 유형을 의미한다는 사실 이해가되지 않습니다 Bar이어야합니다.