android优雅私有方法注释,带有注释参数的私有方法的Android java.lang.VerifyError
我有一個非常簡單的項目可以編譯,但是無法在Emulator上啟動.問題在于這種方法:
private void bar(@Some String a) {} // java.lang.VerifyError
如果刪除注釋,可以避免該問題
private void bar(String a) {} // OK
或方法可見性已更改:
void bar(@Some String a) {} // OK
public void bar(@Some String a) {} // OK
protected void bar(@Some String a) {} // OK
知道原始方法有什么問題嗎?這是達爾維克蟲嗎?
如果有人想嘗試代碼,這里是:
Test.java:
public class Test {
private void bar(@Some String a) {}
public void foo() {
bar(null);
}
}
Some.java:
public @interface Some {}
MainActivity.java:
public class MainActivity extends Activity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
new Test().foo();
}
}
堆棧跟蹤:
ERROR/dalvikvm(1358): Could not find method com.my.Test.bar, referenced from method com.my.Test.foo
WARN/dalvikvm(1358): VFY: unable to resolve direct method 11: Lcom/my/Test;.bar (Ljava/lang/String;)V
WARN/dalvikvm(1358): VFY: rejecting opcode 0x70 at 0x0001
WARN/dalvikvm(1358): VFY: rejected Lcom/my/Test;.foo ()V
WARN/dalvikvm(1358): Verifier rejected class Lcom/my/Test;
DEBUG/AndroidRuntime(1358): Shutting down VM
WARN/dalvikvm(1358): threadid=3: thread exiting with uncaught exception (group=0x4000fe70)
ERROR/AndroidRuntime(1358): Uncaught handler: thread main exiting due to uncaught exception
ERROR/AndroidRuntime(1358): java.lang.VerifyError: com.my.Test
ERROR/AndroidRuntime(1358): at com.my.MainActivity.onCreate(MainActivity.java:13)
ERROR/AndroidRuntime(1358): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1123)
ERROR/AndroidRuntime(1358): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2231)
ERROR/AndroidRuntime(1358): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2284)
ERROR/AndroidRuntime(1358): at android.app.ActivityThread.access$1800(ActivityThread.java:112)
ERROR/AndroidRuntime(1358): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1692)
ERROR/AndroidRuntime(1358): at android.os.Handler.dispatchMessage(Handler.java:99)
ERROR/AndroidRuntime(1358): at android.os.Looper.loop(Looper.java:123)
ERROR/AndroidRuntime(1358): at android.app.ActivityThread.main(ActivityThread.java:3948)
ERROR/AndroidRuntime(1358): at java.lang.reflect.Method.invokeNative(Native Method)
ERROR/AndroidRuntime(1358): at java.lang.reflect.Method.invoke(Method.java:521)
ERROR/AndroidRuntime(1358): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:782)
ERROR/AndroidRuntime(1358): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:540)
ERROR/AndroidRuntime(1358): at dalvik.system.NativeStart.main(Native Method)
解決方法:
這實際上是Eclipse 3.5編譯器(Bug 289576)的一個錯誤,該錯誤使用帶注釋的參數更改了方法的private修飾符,從而使該方法成為“ package-private”.因此,您的:
private void bar(@Some String a) {…}
.class文件中的內容變為:
void bar(@Some String a) {…}
但是,更改后的方法仍由invokespecial JVM指令調用,該指令僅用于私有方法調用(也用于某些其他非方法方面的東西),但是令人驚訝的是,它也適用于Sun / Oracle JVM上的“程序包私有”方法.
在Android期間.class => .dex轉換invokespecial JVM指令被轉換為直接調用Dalvik指令,該指令只能調用私有方法和構造函數.由于bar()方法已成為程序包可見的方法,invoke-direct找不到它,并引發NoSuchMethodError.
解決方案是使用Eclipse 3.6或javac編譯器(通過build.xml ant腳本).
標簽:annotations,verifyerror,java,android
來源: https://codeday.me/bug/20191210/2098518.html
總結
以上是生活随笔為你收集整理的android优雅私有方法注释,带有注释参数的私有方法的Android java.lang.VerifyError的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: android编译会生成class吗,请
- 下一篇: android内存代码,Android内