Javaでは、アクセスチェックの抑制を拒否するSecurityManagerが存在する場合、ClassのnewInstanceがSecurityExceptionをスローする間、ConstructorのnewInstanceメソッドが機能します。ここでは例です:Constructor.newInstanceとSecurityManagerを持つClass.newInstance
import java.lang.reflect.ReflectPermission;
import java.security.Permission;
public class Test {
public static void main(String[] args) throws Exception {
System.setSecurityManager(new SecurityManager() {
@Override
public void checkPermission(Permission perm) {
if (perm instanceof ReflectPermission && "suppressAccessChecks".equals(perm.getName())) {
throw new SecurityException();
}
}
});
String.class.getConstructor().newInstance(); // works
String.class.newInstance(); // throws SecurityException
}
}
が、これは生産の実行:Class.newInstanceため
Exception in thread "main" java.lang.SecurityException
at Test$1.checkPermission(Test.java:10)
at java.lang.reflect.AccessibleObject.setAccessible(AccessibleObject.java:125)
at java.lang.Class$1.run(Class.java:351)
at java.security.AccessController.doPrivileged(Native Method)
at java.lang.Class.newInstance0(Class.java:348)
at java.lang.Class.newInstance(Class.java:325)
at Test.main(Test.java:16)
Javadocはそれがセキュリティマネージャ上のcheckMemberAccessとcheckPackageAccessを呼び出しますが、それはsetAccessibleを呼ぶだろう、なぜ私にはわからないと言っています。この行動の違いの根拠はありますか?
私が使用している:
java version "1.6.0_20"
OpenJDK Runtime Environment (IcedTea6 1.9.5) (ArchLinux-6.b20_1.9.5-1-x86_64)
OpenJDK 64-Bit Server VM (build 17.0-b16, mixed mode)
コード/コメントを読もうとしましたか?これはなぜそれが何をするのかを示すかもしれません。 –
私はOpenJDKのClass.javaを見て、setAccessible呼び出しの直前にこのコメントを見つけました。 "コンシューマー のアクセシビリティチェックを無効にします。ここではセキュリティチェックを行う必要があるので、ここで セキュリティチェックが機能します)。 " 私は外部からの違いがある理由はまだ分かりません。 –
コメントはよく説明されていますが、私にはバグのように見えます。この例外は単純に無視できます。setAccessibleが失敗した場合、既にアクセス可能でnewInstanceが機能していないか、newInstanceが機能しません。どちらも正しいので、例外は無視されても問題ありません。 – maaartinus