Добавьте checkPermission()
метод во все ваши приватные методы / конструкторы.checkPermission используя sun.reflect.Reflection.getCallerClass(int n)
by assert callerClass=selfClass
.
. getCallerClass
возвращает класс метода realFramesToSkip
, кадрирует стек (начиная с нуля), игнорируя кадры, связанные с java.lang.reflect.Method.invoke()
, и его реализацию,Первый кадр связан с этим методом, поэтому getCallerClass(0)
возвращает объект класса для sun.reflect.Reflection
.
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();
}
}