在父类的子类中访问受保护的静态类成员

时间:2016-03-18 19:57:56

标签: java static inner-classes protected

类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。我怎么能这样做(最好没有反思)?

我非常希望不必修改父类,因为它是库的一部分。

3 个答案:

答案 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类的包中创建了类。

反思对你没有任何好处。