沒有辦法知道沒有一些黑客攻擊(見下文)。這看起來像一個接口的情況...類別A和B定義HasX有一個getX()方法。您可以將任何類傳遞給C的構造函數,該構造函數需要實現HasX的任何類。然後C可以調用任何一個對象的getX,並且它不需要知道它實際是哪種類型,但它會得到適當的X值。
public interface HasX {
public int getX();
}
public class A implements HasX {
private int x;
public A()
{
C c = new C(this);
}
public int getX() {
return x;
}
}
public class B implements HasX {
private int x;
public B() {
C c = new C(this);
}
public int getX() {
return x;
}
}
public class C {
HasX hasX;
public C(HasX hasX) {
this.hasX = hasX;
}
public void doStuff() {
int x = hasX.getX();
}
}
爲了雖然回答你原來的問題,它創建了一個對象的對象不存儲任何地方...但是,當C的構建找出類,你可以做一些黑客。下面是我曾經用於Logging實現的一些代碼,它可以通過回顧Throwable的漏洞來檢測誰是調用者。再次,這是不好的做法,但你問那麼... :)
來源:https://github.com/slipperyseal/atomicobjects/blob/master/atomicobjects-lang/src/main/java/net/catchpole/trace/PrintTrace.java
public C() {
String whoCalledMe = whereAmI(new Throwable());
}
private String whereAmI(Throwable throwable) {
for (StackTraceElement ste : throwable.getStackTrace()) {
String className = ste.getClassName();
// search stack for first element not within this class
if (!className.equals(this.getClass().getName())) {
int dot = className.lastIndexOf('.');
if (dot != -1) {
className = className.substring(dot + 1);
}
return className + '.' + ste.getMethodName();
}
}
return "";
}
您可能需要編輯這個只返回類的名字,甚至做的Class.forName( )來解決實際的課程。
如果您想要實際的對象,並且每個類只有1個,您可以將Map中的對象放在classname上。但嘖嘖嘖嘖嘖嘖嘖什麼好:)
什麼是語言?添加標籤。 –
它看起來像是java。我敢肯定,如果你是一個可怕的,可怕的人,你可以通過反思和犧牲山羊來實現這一點。 – Wug