5

URLClassLoader を介してクラスをロードしようとしています (まあ、通常のクラス ローダーでは動作しません) が、権限を持たないようにしたいと考えています。

したがって、起動時にキーを生成する独自のセキュリティマネージャーを作成しました。これは、(メインスレッドで) 1 回だけ要求できます。セキュリティ マネージャには 2 つのリストがあります。applicationThread にはすべての権利が付与され、temporaryList には 1 つの権利が一度だけ付与されます (これはリフレクションに関するものです)。

説明するのが非常に難しいので、すべてをアップロードすることにしました:以下のリンクを見てください。

わかりました、戻ってきます: スレッドに時間がかかりすぎないかどうかをチェックする WatchDog スレッドを作成しました。

URLClassLoader から 2 つのクラスのインスタンス化を開始すると、エラーが発生することなく正確に 30 個のメソッドを呼び出しますが、31 回目の呼び出しで、次のアクセス許可をチェックしようとしますが、これは 30 回目の呼び出しの後で発生します。

java.lang.RuntimePermission accessClassInPackage.sun.reflect)、

そこで何が起こっているか知っている人はいますか?

編集:例を削除する時間がありました。 http://myxcode.at/securitymanager.zip SecurityManager が同期を要求されていないことがわかりました。この小さなコードを実行して、赤い線を見てください。

赤い線が最初の行にある場合は、プログラムをもう一度実行すると、少し制御されていないように見えることがわかります。

多かれ少なかれ問題は、セキュリティマネージャーを同期する必要があることです。エラー(バグ?)に直面できない人のための私の出力は 次のとおりですhttp://pastebin.com/E9yLRLif

edit2: 多分それはコンソールについてですか? 多分コンソールが遅すぎる?

4

1 に答える 1

4

私にとって、チェックは次の場合に発生しi=15ます。

checkPermission ((java.lang.RuntimePermission accessClassInPackage.sun.reflect) ) for Thread[main,5,main]

許可チェックが遅れた理由は、inflationThresholdのメソッドでReflectionFactory使用されるクラスの です:invokeNativeMethodAccessorImpl.java

public Object invoke(Object obj, Object[] args)
        throws IllegalArgumentException, InvocationTargetException {
    if (++numInvocations > ReflectionFactory.inflationThreshold()) {
        MethodAccessorImpl acc = (MethodAccessorImpl) new MethodAccessorGenerator()
                .generateMethod(method.getDeclaringClass(), method
                        .getName(), method.getParameterTypes(),
                        method.getReturnType(), method
                                .getExceptionTypes(), method
                                .getModifiers());
        parent.setDelegate(acc);
    }

    return invoke0(method, obj, args);
}

遅延を無効にするには、Reflection API を使用できます:)

Field hack = Class.forName("sun.reflect.ReflectionFactory").getDeclaredField("inflationThreshold");
hack.setAccessible(true);
hack.set(null, 0);
于 2011-11-02T23:18:54.117 に答える