Thêm phương thức checkPermission()
vào tất cả phương thức/phương thức riêng của bạn. checkPermission sử dụng sun.reflect.Reflection.getCallerClass(int n)
bằng cách khẳng định callerClass=selfClass
.
getCallerClass
trả về lớp của phương thức realFramesToSkip
khung lên ngăn xếp (không dựa trên cơ sở), bỏ qua các khung được liên kết với java.lang.reflect.Method.invoke()
và triển khai. Khung đầu tiên được liên kết với phương thức này, do đó, getCallerClass(0)
trả về đối tượng Lớp cho 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();
}
}
}
Bạn có thể thử để kiểm tra phản ánh, nó sẽ thất bại:
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();
}
}
Đây sẽ là một lựa chọn tốt đẹp để có cho hộp, bình ký kết. "Trong mọi trường hợp, cho phép phản chiếu đối với các lớp trong tệp jar này". Nhưng tôi nghĩ, không có tính năng như vậy. – Thilo