类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成员变量,尽管类Clause受到保护,成员变量foo也受到保护。
我只是希望能够检查一下受保护静态类Clause的成员变量foo。我怎么能这样做(最好没有反思)?
我非常希望不必修改父类,因为它是库的一部分。
答案 0 :(得分:1)
aioobe的评论是正确的。
与外部类共享一个超类并不足以访问静态内部类的受保护成员。
来电者的课程并没有扩展条款,而是在不同的课程中。要使protected
具有相关性,您必须从子句的子类中访问foo,或者从与ExtendedDismaxQParser相同的包中的类访问它。
答案 1 :(得分:0)
正如评论中已经说过的那样,在@Nathan Hughes的答案中已经很好地解释了,你无法访问protected
中的Clause
字段,因为它不是被扩展的类。
不幸的是,通过反思来访问此字段的唯一方法是
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();
}
}
}
答案 2 :(得分:-2)
受保护的访问修饰符仅允许在包中访问变量和方法。您已在Clause类的包中创建了类。
反思对你没有任何好处。