在所有私有方法/构造函数中添加checkPermission()方法。
通过断言callerClass=selfClass使用sun.reflect.Reflection.getCallerClass(int n)检查CheckPermission。
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();
}
}