2010-11-09 29 views
1

Java有沒有什麼方法可以找到對象所屬的類?Java - 如何找到一個對象是類的一部分

class WrapperClass 
{ 
    SomeObject o; 
    ... 
    someMethodOfWrapperClass() 
    { ... } 
} 

[...] 

SomeObject foo = new SomeObject(); 
WrapperClass wrap = new WrapperClass(); 
wrap.o = foo; 

有沒有辦法找到對應的WrapperClass對象從wrap的SomeObject對象或它的方法嗎?
沿着東西線:

foo.getWrapperClassObject().someMethodOfWrapperClass(); 

謝謝你提前很多!

托馬斯

+2

這是一些非常臭的代碼IMO。 – 2010-11-09 19:53:03

+1

同意。看起來他應該使用繼承。但是,如果不在兩個類之間引入循環依賴(這很糟糕),就沒有辦法讓它按照上面的建議工作。 – 2010-11-09 20:00:50

+1

我的建議是放棄這個設計,並想一想爲什麼你真的需要這一點。否則,在SomeObject類中有一個鏈接到它的包裝器對象。 – rkatiyar 2010-11-09 20:02:13

回答

0

你可以有地方SomeObject被告知其父是誰一個父子關係,所以當你getWrapperClassObject(),你會只返回存儲父指針。

實施例的構造:

SomeObject(WrapperClass parent) { this.parent = parent; } 
+0

如果你有對SomeObject的控制權,這很好,但在這種情況下,換個SomeObject沒有意義,爲什麼不把所需的方法添加到SomeObject中。當我們無法控制它的內容時,通常我們會包裝一個類。這也創建了一個循環依賴。 – 2010-11-09 19:57:57

0

在SomeObject:WrapperClass.this.someMethodOfWrapperClass();

+0

這甚至不會執行原始海報的要求。 – 2010-11-09 19:57:05

2

簡短的回答是 「否」。

爲用戶robev曾建議你可以這樣做,並傳遞到包裝類的引用爲SomeObject,而是創建了兩個類之間的循環關係,WrapperClass不再真的的包裝類。

它引發的問題爲什麼你試圖做到這一點。

在大多數情況下,當我們創建一個包裝類時,我們正在封裝我們無法控制的代碼,所以您通常不能修改SomeObject的構造函數。

你有沒有想過嘗試繼承?也許你的WrapperClass應該延伸SomeObject,增加someMethodOfWrapperClass()方法作爲額外的行爲。

也許是這樣的:

public class ExtendingClass extend SomeObject 
{ 
    public void someMethodOfExtendingClass() 
    { ... } 
} 

// so you can define an instance 'foo' which is ALSO an instance of SomeObject 
ExtendingClass foo = new ExtendingClass(); 

// now you can call... 
foo.someMethodOfExtendingClass(); 
0

我真的不能相信它是有道理的做你正在嘗試做的情況......但你可能會發現一個內部類中做它有用。 ..

class Outer 
{ 
    Inner inner = new Inner(); 

    class Inner 
    { 
     void foo() 
     { 
      bar(); 
     } 
    } 

    void bar() 
    { 
     System.out.println("bar"); 
    } 

    public static void main(String[] argv) 
    { 
     Outer o; 

     o = new Outer(); 
     o.inner.foo(); 
    } 
} 

通過robev答案基本上是相同的,但robev有更通用的答案(內有我貼的代碼外引用,它只是隱藏起來,由編譯器生成)。

+0

好點,豆腐啤酒,雖然我真的不想鼓勵原始海報使用這種設計。在我看來,他們似乎需要使包裝類擴展原始類,以便他們可以調用附加方法。 – 2010-11-09 20:09:15

0

正如其他人所說,這是相當可疑的代碼。

有幾種實現方法。

  1. 一個會添加一個引用到包裝SomeObject但導致像賈斯汀指出的循環依賴。
  2. 其次,將簡單地製作SomeObjectWrapper extends SomeObject,但你甚至可以控制該部分代碼?
  3. 最後將是建立一個公約,並使用反射來獲取的代碼(我用的是一個是WrappedObject.name +「包裝」):

    package test; 
    public class ObjectWrapper { 
        Object o; 
        public ObjectWrapper(Object o){ 
        this.o = o; 
    } 
    } 
    
    
    Object o = new Object(); 
    String pack = "test"; 
    String name = package+o.getClass().getSimpleName()+"Wrapper"; 
    Class objWrapper = Class.forName(name); 
    
    
    objWrapper.getConstructor(Object.class).newInstance(o); 
    

但這遠遠不是太笨重有任何用處。例如,如果您製作Object o = new Integer,則整個事件將從例外中爆發。

+0

我的假設是他可以控制包裝器對象,但不能控制源對象。如果是這樣,選項2將正常工作。 – 2010-11-09 20:47:38

+0

是的,這將是最合乎邏輯的事情;不知何故,這個問題引發了設計包裝物體而不是包裝物的問題。 – 2010-11-09 21:17:55

0

這個問題沒有意義。對象不是'類的一部分。 參考文獻是類的一部分,但它們指向的不是。多個引用可以指向同一個對象。所以你甚至不能得到任何特定對象的唯一參考,更不用說參考是什麼類。

相關問題