ええと、それはsetAccessibleのために働きます。見る:
class A {
private String method1() {
return "Hello World!";
}
}
と
import java.lang.reflect.Method;
class B {
public static void main(String[] args) throws Exception {
System.setSecurityManager(new SecurityManager());
Class clazz = A.class;
Method m = clazz.getDeclaredMethod("method1");
m.setAccessible(true);
}
}
結果は
Exception in thread "main" java.security.AccessControlException: access denied ("java.lang.reflect.ReflectPermission" "suppressAccessChecks")
at java.security.AccessControlContext.checkPermission(Unknown Source)
at java.security.AccessController.checkPermission(Unknown Source)
at java.lang.SecurityManager.checkPermission(Unknown Source)
at java.lang.reflect.AccessibleObject.setAccessible(Unknown Source)
at B.main(B.java:8)
うまくいかなかった理由の1つは、この投稿のコメントによると、Java 1.5では機能していなかったが、6以降では機能することです。
編集:特定のjarに対してそれを拒否するには、ポリシーファイルを使用する必要があります。例:
// specific file
grant codeBase "file:/test/path/tools.jar" {
// no permissions for this one
};
// default to giving all
grant {
permission java.security.AllPermission;
};
ポリシーファイルを指定するには、デフォルトへの追加として指定する方法と、指定されたもののみを指定する方法(source)の2つの方法があります。
使用する場合
java -Djava.security.manager -Djava.security.policy==someURL SomeApp
(doubleが等しいことに注意してください)次に、指定されたポリシーファイルのみが使用されます。セキュリティプロパティファイルに示されているものはすべて無視されます。
...または、それほど難しく見えないカスタムセキュリティマネージャを実装します。しかし、自分でそれをしたことはありません。