我想在编译时在方法中注入代码。我试过了aspectj
,但它有问题。我无法让它正常工作。此外,它在Android Studio中得不到很好的支持。
我想要的例子 -
编译前
public void doSomething() {
doing..
}
编译代码后应该看
public void doSomething() {
code injected here
doing..
code injected here
}
我该如何做一些注释方法@aroundMethod
,它可以生成该代码
答案 0 :(得分:0)
AspectJ用于此类事情。这是一个很好的Android示例,如何在Android世界中执行各个方面:https://github.com/firstthumb/AspectJ-Android-Example
他们的代码中的一个例子:
package android.mobile.peakgames.net.aspectjandroid.aspect;
import android.util.Log;
import android.widget.Button;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.*;
@Aspect
public class LoggingAspect {
private static final String TAG = LoggingAspect.class.getName();
@Pointcut("execution(* android.view.View.OnClickListener.onClick(..))")
public void onClickEntryPoint() {
}
@Before("onClickEntryPoint()")
public void onClickBefore(JoinPoint joinPoint) {
Log.d(TAG, "Before Advice ==> Clicked on : " + ((Button)joinPoint.getArgs()[0]).getText());
}
@Around("onClickEntryPoint()")
public void onClickAround(ProceedingJoinPoint joinPoint) throws Throwable {
Log.d(TAG, "Around Advice ==> Clicked on : " + ((Button)joinPoint.getArgs()[0]).getText());
joinPoint.proceed();
}
@After("onClickEntryPoint()")
public void onClickAfter(JoinPoint joinPoint) {
Log.d(TAG, "After Advice ==> Clicked on : " + ((Button)joinPoint.getArgs()[0]).getText());
}
@AfterReturning(pointcut = "onClickEntryPoint()")
public void onClickAfterReturning() {
Log.d(TAG, "AfterReturning Advice ==>");
}
}
通常,我们的想法是使用@Aspect这样的方法注册一个方面类,然后定义何时使用@Pointcut,@ Before,@ Around和@After调用特定方法的方法将受到方面。例如,方法onClickBefore将在某人从此类执行onClickEntryPoint之前执行。 JoinPoint参数可用于不同的目的,例如获取受方面影响的方法的参数。