检查呼叫者的类以锁定所有不需要的呼叫者。调用者的类可以从堆栈跟踪中获得。在下面的示例中,只有 Bar 的实例会触发 system.out.println,所有其他实例都会触发异常。您甚至可以通过这种方式进行包级检查。确保所有允许的调用者类方法都不是公共的,或者它们可以间接调用 doSomething 方法。您甚至可以通过进一步检查堆栈跟踪来进行更深入的检查。
但请注意,熟练的开发人员可以规避您在此问题上尝试做的任何事情。没有解决方案是真正“安全”的。
package one.two;
import one.Bar;
public class Foo {
public void doSomething() {
StackTraceElement[] stackTrace = Thread.currentThread().getStackTrace();
StackTraceElement stackTraceElement = stackTrace[2];
String className = stackTraceElement.getClassName();
if (Bar.class.getName().equals(className)) {
System.out.println("jay!");
} else {
throw new RuntimeException("not allowed");
}
}
}
package one;
import one.two.Foo;
public class Bar {
void makeCall() {
new Foo().doSomething();
}
public static void main(String[] args) {
new Bar().makeCall();
}
}