ないIllegalAccessError:メソッドは、クラスにアクセスできない

唯名論:

それだけで生成されたからアプリをインストールした後に起こるので、私は、非常に奇妙なエラーを持っています.apk私はIDEを通じてアプリを実行しようとすると、それが正常に動作します。

java.lang.IllegalAccessError: Method 'int <package>.BaseActivity$Companion.getANIMATION_SLIDE_FROM_RIGHT()' is inaccessible to class '<package>.MyActivity' (declaration of '<package>.MyActivity' appears in /data/app/<package>-mg7eYmJ8hX5WvkNWNZWMVg==/base.apk!classes3.dex)

あなたが見ることができるようにというクラスがありBaseActivity、次のようになります。

open class BaseActivity : AppCompatActivity() {

    companion object {
        @JvmStatic
        protected val ANIMATION_DEFAULT = 0
        @JvmStatic
        protected val ANIMATION_SLIDE_FROM_RIGHT = 1
        @JvmStatic
        protected val ANIMATION_SLIDE_FROM_BOTTOM = 2
    }

    protected open var animationKind = ANIMATION_DEFAULT

    // Some other stuff
}

今、すべての活動は、このクラスを拡張し、多くの場合、上書きされますanimationKind。このように:

class MyActivity: BaseActivity() {

    override var animationKind = ANIMATION_SLIDE_FROM_RIGHT

    // Some other stuff
}

問題は、それがあるANIMATION_SLIDE_FROM_RIGHTためアクセスできないMyActivity私はそれが手動でのみ生成に起こることを繰り返すことになります.apk面白いことに、私はmultidexを使用していないんだけど、エラーがあることを示すように見えるということであるBaseActivityですclasses3.dexここに私のGradleファイルは以下のとおりです。

'com.android.application' プラグイン適用されます:プラグイン適用 'kotlin-アンドロイドは、' プラグイン適用されます:「kotlin-アンドロイド-Extensionsのプラグインを適用する: 'kotlin-kapt' を

android {

    compileSdkVersion 28

    defaultConfig {
        applicationId <package>
        versionCode <versionCode>
        versionName <versionName>
        minSdkVersion 21
        targetSdkVersion 28
    }

    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }

    androidExtensions {
        experimental = true
    }
}

dependencies {

    // Dependencies
}

私はと遊ぶことを試みたmultidexEnabled false/trueが、唯一の変更はしていることであるfalse状態classes3.dexサフィックスが消えます。

更新

私が変更されたときもちろんMyActivityanimationKindプロパティをし1、その後、すべてが正常に動作します。

UPDATE 2

除去した後@JvmStatic、視認性を保護し、それが正常に動作します。

ビナイRathod:

公式Kotlinのドキュメント

Javaは、Javaクラスは、コードへのより広範なアクセスを持つことになりますので、同じパッケージに他のクラスからprotectedメンバにアクセスし、Kotlinにはないことができます

だから、必ずあなたのことを確認してくださいBaseActivityMyActivity同じパッケージの下にあります。

両方の活動は、同じパッケージ下にない場合、それはメーカーからの直接実行によって完全に実行されますが、あなたがた.apk生成し、そのAPKをインストールすることで、デバイス上で実行しようとしながら、それは(ないIllegalAccessErrorを)クラッシュします。

おすすめ

転載: http://43.154.161.224:23101/article/api/json?id=186594&siteId=1