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
만 간단한 추상 포인트 컷가 구현 될 수있다.
제 질문은이 방법으로 매개 변수를 가져올 수 있는지 여부입니다. 가능한 경우 구성 방법.
좀 더 읽기 쉽게하기 위해 코드에 구문 강조를 추가했습니다. 그러나 철자법과 문법을 조금 더 조심하십시오. "aspect"대신 "apect"와 같은 패키지 이름을 사용하고 "method"대신 "methon"을 말하는 로그 메시지를 사용합니다. 당신은 많은 곳에서 완전한 문장을 쓰지 않으므로, 당신이 말하고자하는 것을 언외하기가 매우 어렵습니다. 제 제안은 더 많은 시간을 들여 이해하기 쉽도록하거나, 영어로 문제가 해결되지 않으면 회사 부서에서 누군가 도와 주어 문제를 해결하는 것입니다. – kriegaex