【发布时间】:2015-06-26 01:20:01
【问题描述】:
我正在设置和@Around aspect 在后台线程上运行一个方法,它看起来像这样
@Aspect
public class ThreadAspect {
@Around("call(@Background void *(..))")
public void runInBackground(final ProceedingJoinPoint jp) throws Throwable {
new Thread(new JPRunner(jp)).start();
}
private static class JPRunner implements Runnable {
...
@Override
public void run() {
try {
jp.proceed();
} catch (Throwable e) {
Log.e("TEST", "ThreadAspect", e);
}
}
}
}
我在一个采用String 的方法上应用了@Background 注释,但它与ClassCastException 在jp.proceed() 的行上失败了
E/TEST (20943): java.lang.ClassCastException: java.lang.String cannot be cast to org.aspectj.lang.JoinPoint
有趣的是,如果我不使用线程,调用似乎可以顺利通过。如何让它在线程上运行?
如果重要的话,我在 android 上使用 aspectj 和 this plugin。
编辑:这是失败的代码
// Background.java
package com.github.larvyde.ex.aspect;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface Background {}
// MainActivity.java
package com.github.larvyde.ex.aspect;
import android.os.Bundle;
import android.util.Log;
public class MainActivity extends android.support.v7.app.AppCompatActivity {
@Override
public void onCreate(Bundle saved) {
super.onCreate(saved);
Log.v("TEST", "calling runInBackground");
runInBackground("run #1");
Log.v("TEST", "calling runInBackground again");
runInBackground("run #2");
}
@Background
public void runInBackground(String str) {
Log.v("TEST", str);
}
}
// ThreadAspect.java
package com.github.larvyde.ex.aspect;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import android.util.Log;
@Aspect
public class ThreadAspect {
@Around("call(@Background void *(..))")
public void runInBackground(ProceedingJoinPoint jp) throws Throwable {
new Thread(new JPRunner(jp)).start();
}
private static class JPRunner implements Runnable {
private final ProceedingJoinPoint jp;
public JPRunner(ProceedingJoinPoint jp) {
this.jp = jp;
}
@Override
public void run() {
try {
jp.proceed();
} catch (Throwable e) {
Log.e("TEST", "ThreadAspect", e);
}
}
}
}
日志
$ adb logcat | egrep 'TEST|AndroidRuntime'
V/TEST (21315): calling runInBackground
V/TEST (21315): calling runInBackground again
E/TEST (21315): ThreadAspect
E/TEST (21315): java.lang.ClassCastException: java.lang.String cannot be cast to org.aspectj.lang.JoinPoint
E/TEST (21315): at com.github.larvyde.ex.aspect.MainActivity$AjcClosure1.run(MainActivity.java:1)
E/TEST (21315): at org.aspectj.runtime.reflect.JoinPointImpl.proceed(JoinPointImpl.java:149)
E/TEST (21315): at com.github.larvyde.ex.aspect.ThreadAspect$JPRunner.run(ThreadAspect.java:25)
E/TEST (21315): at java.lang.Thread.run(Thread.java:818)
E/TEST (21315): ThreadAspect
E/TEST (21315): java.lang.ClassCastException: java.lang.String cannot be cast to org.aspectj.lang.JoinPoint
E/TEST (21315): at com.github.larvyde.ex.aspect.MainActivity$AjcClosure3.run(MainActivity.java:1)
E/TEST (21315): at org.aspectj.runtime.reflect.JoinPointImpl.proceed(JoinPointImpl.java:149)
E/TEST (21315): at com.github.larvyde.ex.aspect.ThreadAspect$JPRunner.run(ThreadAspect.java:25)
E/TEST (21315): at java.lang.Thread.run(Thread.java:818)
【问题讨论】: