日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > Android >内容正文

Android

android优雅私有方法注释,带有注释参数的私有方法的Android java.lang.VerifyError

發(fā)布時間:2025/4/17 Android 42 豆豆
生活随笔 收集整理的這篇文章主要介紹了 android优雅私有方法注释,带有注释参数的私有方法的Android java.lang.VerifyError 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

我有一個非常簡單的項目可以編譯,但是無法在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)的一個錯誤,該錯誤使用帶注釋的參數(shù)更改了方法的private修飾符,從而使該方法成為“ package-private”.因此,您的:

private void bar(@Some String a) {…}

.class文件中的內(nèi)容變?yōu)?#xff1a;

void bar(@Some String a) {…}

但是,更改后的方法仍由invokespecial JVM指令調(diào)用,該指令僅用于私有方法調(diào)用(也用于某些其他非方法方面的東西),但是令人驚訝的是,它也適用于Sun / Oracle JVM上的“程序包私有”方法.

在Android期間.class => .dex轉(zhuǎn)換invokespecial JVM指令被轉(zhuǎn)換為直接調(diào)用Dalvik指令,該指令只能調(diào)用私有方法和構(gòu)造函數(shù).由于bar()方法已成為程序包可見的方法,invoke-direct找不到它,并引發(fā)NoSuchMethodError.

解決方案是使用Eclipse 3.6或javac編譯器(通過build.xml ant腳本).

標簽:annotations,verifyerror,java,android

來源: https://codeday.me/bug/20191210/2098518.html

總結(jié)

以上是生活随笔為你收集整理的android优雅私有方法注释,带有注释参数的私有方法的Android java.lang.VerifyError的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。