檢查調用者的類來鎖定所有不受歡迎的來電。調用者的類可以從堆棧跟蹤中獲得。在下面的例子中,只有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();
}
}
也許看一看[OSGi包(http://en.wikipedia.org/wiki/OSGi#Bundles)。 –
謝謝,它確實看起來像一個解決方案,但OSGi似乎有點沉重,因爲僅僅向共享庫發佈共享庫.jar。 :) – cib