如何在方法的开始和结束中注入一些代码

时间:2018-03-09 11:07:47

标签: java android

我想在编译时在方法中注入代码。我试过了aspectj,但它有问题。我无法让它正常工作。此外,它在Android Studio中得不到很好的支持。 我想要的例子 -

编译前

public void doSomething() {
       doing..
}

编译代码后应该看

public void doSomething() {
       code injected here
       doing..
       code injected here
 }

我该如何做一些注释方法@aroundMethod,它可以生成该代码

1 个答案:

答案 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参数可用于不同的目的,例如获取受方面影响的方法的参数。