プライベートメソッド/コンストラクタのすべてにcheckPermission()
メソッドを追加します。 checkPermission sun.reflect.Reflection.getCallerClass(int n)
by assert callerClass=selfClass
getCallerClass
は、realFramesToSkip
フレームのクラスをスタック(ゼロベース)に戻し、java.lang.reflect.Method.invoke()
に関連付けられたフレームとその実装を無視します。最初のフレームはこのメソッドに関連付けられているフレームなので、getCallerClass(0)
はsun.reflect.Reflection
のClassオブジェクトを返します。
public class PrivateConstructorClass {
private PrivateConstructorClass() {
checkPerMission();
//you own code go below
}
void checkPerMission() {
Class self = sun.reflect.Reflection.getCallerClass(1);
Class caller = sun.reflect.Reflection.getCallerClass(3);
if (self != caller) {
throw new java.lang.IllegalAccessError();
}
}
}
あなたが反映テストしようとすることができ、それは失敗します。
public class TestPrivateMain {
Object newInstance() throws Exception {
final Class<?> c = Class.forName("package.TestPrivate");
final Constructor<?> constructor = c.getDeclaredConstructor();
constructor.setAccessible(true);
return constructor.newInstance();
}
public static void main(String[] args) throws Exception {
Object t = new TestPrivateMain().newInstance();
}
}
これは署名の瓶を持っているための良い選択肢だろう。 "いかなる状況下でも、このjarファイル内のクラスに対するリフレクションを許可する"。しかし、私はそのような特徴はないと思う。 – Thilo