簡體   English   中英

與超類私有成員(Java)合作

[英]Working with a superclasses private member (Java)

我已經從Java類的類中構建了一個子類,該類具有要在子類中訪問的私有方法,我無法更改或編輯超類。 問題是他們當然是私人的。 假設我自己編寫了超類,並且出於某些原因,這些方法必須是私有的。 我可以將代碼復制到子類中。 但是在編寫子類時,是否有更好的方法(不產生太多的代碼行)能夠使用它們呢?

使超類方法成為protected 它只能從sub-class和包中訪問。

private修飾符只能在課堂上使用。

因此,您嘗試使用“擴展”從超類繼承方法。 當然,它們是私有的,但是您可以在子面板中使用它們。 使它們成為抽象將迫使您私下重寫每個文件,我沒有其他選擇。

忽略執行此操作的原因可能非常糟糕(使用私有變量沒有契約,因此無法保證它們不會更改或完全消失!),您可能可以使用反射來執行您想要的操作:

使用方法:
http://docs.oracle.com/javase/6/docs/api/java/lang/Class.html#getDeclaredField(java.lang.String
http://docs.oracle.com/javase/6/docs/api/java/lang/reflect/AccessibleObject.html#setAccessible(boolean
http://docs.oracle.com/javase/6/docs/api/java/lang/reflect/Field.html#get(java.lang.Object

Class c = object.getClass();
Field field = c.getDeclaredField("somePrivateInstanceVariable");
field.setAccessible(true);
Object someValue = field.get(object);

我只想強調,您應該考慮這樣做的原因並決定反對! 如果您擁有要擴展的代碼,請考慮是否應該將該字段設置為protected而不是private 記住,鈎住您不應該訪問的代碼會破壞OOP原理(您正在規避封裝),並且不能保證您的應用程序所依賴的代碼不會在庫的更新中消失(因此,也將自己鎖定到lib的固定版本)。

在您的情況下,應將私有方法聲明為protected。 閱讀此內容以獲得有關該主題的更多詳細信息。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM