呼び出し元のクラスをチェックして、不要な呼び出し元をすべてロックアウトします。呼び出し元のクラスは、スタック トレースから取得できます。以下の例では、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();
}
}