2013-01-23 43 views
1

我有2類的類&類B,其中Class A extends Class B在反射超類的構造問題

現在,在一類的構造函數,我有

Class A(Integer integerParam){ 

    B superclass = new B(integerParam); 

} 

和B類的構造函數是

Class B(Integer integerParam) { 

    System.out.println(integerParam); 
} 

除此之外我在B類的一些方法如下

public void ClassBMethod(){ 
    System.out.println(integerParam); 
} 

我想使用反射來調用父類方法ClassBMethod,我創建超類的一個實例來完成這樣的

Class superClazz = Class.forName(classInstance.getClass().getSuperclass().getName()); 
Constructor superClassconstructor = superClazz.getConstructor(new Class[]{Integer.class}); 
Object superclassInstance = superClassconstructor.newInstance(integerParam); 

的問題是這裏的超級類的實例創建兩次,一次通過A類構造函數,另一次通過反射。

我如何可以調用避免這種情況並調用父類的方法,而無需創建實例

+1

這就是Java的精髓。你無法避免。此外,請閱讀Java命名約定。 – adarshr

+0

相關 - 不重複雖然 - http://stackoverflow.com/questions/1878558/jump-over-parent-constructor-to-call-grandparents – Jayan

+0

那麼,如果我不得不避免它,這將是什麼解決方法。 – Vivek

回答

2

我不是100%肯定,但我認爲你可能會想做到這一點...

A classInstance= new A(42); 
Class superClazz = Class.forName(classInstance.getClass().getSuperclass().getName()); // or just superClazz = classInstance.getClass().getSuperClass(); 
Method classBMethod = superClazz.getMethod("classBMethod"); 
classBMethod.invoke(classInstance); // Invoke classBMethod on existing instance, without using any constructor reflectively 

換句話說,如果我理解正確的話,你不希望被稱爲構造兩次?你想在已經存在的實例上調用classBMethod()



此外,對於A構造看起來很奇怪。從構造函數的簽名來看,感覺它將使最有意義的構造函數是:

public A(Integer integerParam){ 
    super(integerParam); 
} 

這樣的解釋:

讓我們比較的類A和B更具體的對象:

class A <--> class Apple 
class B <--> class Fruit 
Integer integerParameter <--> double weight 

如果你正在做的構造:

public Apple(double weight){ 
    super(weight); 
} 

你是essentialy說,當你創建一個蘋果(new Apple(someWeight);),蘋果是一個重量== someWeight的水果。

如果你正在做的:

public Apple(double weight){ 
    Fruit b = new Fruit(weight); 
} 

這意味着:當你打電話new Apple(someWeight)您創建一個不同的水果b(不是蘋果本身),你給someWeight。所以基本上你所擁有的是一個重量不明的蘋果,另一個重量不明的水果。由於其他水果是在構造函數中聲明的,只要構造函數完成,其他水果就會消失。唯一剩下的就是一個未指定權重的蘋果(或者默認構造函數指定的默認權重)。

+0

是的,我想調用它在同一個實例 – Vivek

+0

這工作...謝謝@Alderath :) – Vivek

3

每當一個類的構造函數被調用,它的超類的構造函數被調用,然後在類的構造函數上面的等級高達Object。沒有辦法避免這種情況。

+0

那麼,如果我必須避免這個問題,那麼解決方法是什麼? – Vivek

+0

如果方法不是私有的,你可以簡單地從子類中調用超級類中的方法。 –

1

你可以寫在A類:super.ClassBMethod()

如果您需要使用反射(這是家庭作業?),然後 遵循Alderath的答案。我只將簡化一行有:

Class superClazz =classInstance.getClass().getSuperclass() 

或只是

Class superClazz = B.class; 
+0

這不會反射,雖然... – Alderath