Agregue el método checkPermission()
en todo su método/constructor privado. checkPermission usando sun.reflect.Reflection.getCallerClass(int n)
por la afirmación callerClass=selfClass
.
getCallerClass
devuelve la clase del método realFramesToSkip
fotogramas de la pila (basada en cero), ignorando las tramas asociadas con java.lang.reflect.Method.invoke()
y su implementación. El primer fotograma es el asociado a este método, por lo que getCallerClass(0)
devuelve el objeto Clase para 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();
}
}
}
Usted puede tratar de probar reflejan, se producirá un error:
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();
}
}
Esta sería una buena opción para tener frascos firmados. "Bajo ninguna circunstancia, permita la reflexión contra las clases en este archivo jar". Pero creo que no hay tal característica. – Thilo