[英]Accessing protected member of static class in subclass of the parent
類ExtendedDismaxQParser具有靜態成員類Clause:
public class ExtendedDismaxQParser {
protected static Class Clause {
protected String foo, bar;
}
public Clause getAClause {
Clause c;
// misc code that isn't important
return c;
}
}
然后,我在另一個包中擴展了該類:
public class SpecialDismaxQParser extends ExtendedDismaxQParser {
public void whatever() {
Clause c = super.getAClause();
boolean baz = c.foo.equals("foobar"); // <-- This doesn't compile
}
}
盡管事實是類子句受到保護,成員變量foo也受到保護,但您似乎無法訪問foo成員變量。
我只希望能夠檢查有關受保護的靜態類Clause的成員變量foo的某些信息。 我該怎么做(最好是無反射)?
我非常希望不必修改父類,因為它是庫的一部分。
aioobe的評論是正確的。
與外部類共享一個超類還不足以訪問靜態內部類的受保護成員。
調用方的類不擴展Clause,並且在不同的包中。 為了使protected
與protected
相關,您必須從Clause的子類中訪問foo,或者從與ExtendedDismaxQParser相同的程序包中的類訪問它。
正如評論中已經說過的那樣,@ Nathan Hughes的答案很好地解釋了這一點,您不能訪問Clause
的protected
字段,因為它不是正在擴展的類。
不幸的是,訪問此字段的唯一方法是通過反射
public class SpecialDismaxQParser extends ExtendedDismaxQParser {
public void whatever() {
try {
Field fooField = Clause.class.getDeclaredField("foo");
fooField.setAccessible(true);
Clause c = super.getAClause();
boolean baz = fooField.get(c).equals("foobar");
} catch (NoSuchFieldException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
}
}
}
受保護的訪問修飾符僅允許在包內訪問變量和方法。 您已經在Clause類的包內創建了類。
反思在這里對您沒有任何好處。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.