我設立和@Around
方面運行在後臺線程的方法,它看起來像這樣ProceedingJoinPoint.proceed()失敗,並拋出ClassCastException當新的線程運行
@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);
}
}
}
}
我所應用的@Background
註釋一個方法,它接受String
但它失敗,就行了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)
不,它幾乎是從我的代碼複製粘貼。嗯,我看你測試它在普通的Java,所以我想這可能是一個問題與我使用的android aspectj插件... – larvyde
我不這麼認爲。請提供[SSCCE](http://sscce.org/),以便使問題可以重現並證明相反。如果我能重現它,我可以幫助你。 – kriegaex
在問題中增加了完整的代碼。 – larvyde