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

Java 访问父类的子类中静态类的受保护成员,java,static,inner-classes,protected,Java,Static,Inner Classes,Protected,类ExtendedDismaxQParser有一个静态成员类子句: public class ExtendedDismaxQParser { protected static Class Clause { protected String foo, bar; } public Clause getAClause { Clause c; // misc code that isn't important ret

类ExtendedDismaxQParser有一个静态成员类子句:

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
    }
}
公共类SpecialDismaxQParser扩展了ExtendedDismaxQParser{
公共空间{
子句c=super.getAClause();

boolean baz=c.foo.equals(“foobar”);//受保护的访问修饰符只允许在包内访问变量和方法。您已经在子句类的包内创建了类


反射在这里对您没有任何好处。

受保护的访问修饰符只允许在包内访问变量和方法。您已经在子句类的包内创建了类


反思在这里对你没有任何好处。

aioobe的评论是正确的

与外部类共享超类不足以访问静态内部类的受保护成员


调用方的类不是extend子句,而是在不同的包中。要使
protected
相关,您必须从子句的子类中访问foo,或者从与ExtendedDismaxQParser相同包中的类访问foo。

aioobe的注释是正确的

与外部类共享超类不足以访问静态内部类的受保护成员


调用方的类不扩展子句,而是在不同的包中。要使
受保护的
相关,您必须从子句的子类中访问foo,或者从与ExtendedDismaxQParser相同的包中的类访问foo。

如评论中所述,并在@Nathan Hughes的回答中进行了很好的解释,您无法访问
子句
中的
受保护
字段,因为它不是要扩展的类

不幸的是,访问此字段的唯一方法是通过反射

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();
        }
    }
}

正如在评论中已经说过的,在@Nathan Hughes的回答中也有很好的解释,您不能访问
子句
中的
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();
        }
    }
}


这是因为子句不是要扩展的类。这里有一个很好的参考表:看一下。我已经写了一个答案,但我的internet关闭了,它似乎已经被删除。基本上,将字段
设置为public
,因为它们当前仅对内部类的子类(以及同一包中的其他地方)可见。大多数分析都描述类,而不是内部类。@zelinka但规则仍然适用。正如我所说,
protected
内部类的成员只能访问内部类的子类(以及包中的其他部分)。这是因为子句不是要扩展的类。这里有一个很好的参考表:看一下。我已经写了一个答案,但我的internet断开了,它似乎已被删除。基本上,将字段
设置为public
,因为它们当前仅对内部类的子类(以及同一包中的其他地方)可见。大多数分析都描述类,而不是内部类。@zelinka但规则仍然适用。正如我所说,
protected
内部类的成员只能访问内部类的子类(以及包中的其他部分)。你不是把它和包私有访问混淆了吗?在关闭之前,只需谷歌Java访问修饰符voting@rahsan在发布错误答案之前,只需使用Google Java access修饰符。
受保护的
访问也适用于子类。
受保护的
成员对子类可见。@bcsb1001我的评论不建议使用其他方法。M然而,y评论指出了答案中的一个错误,声称“仅在包内访问”你没有把它和包私有访问混为一谈吗?在关闭之前只需要谷歌Java访问修饰符voting@rahsan在发布错误答案之前,只需使用Google Java access修饰符。
受保护的
访问也适用于子类。
受保护的
成员对子类可见。@bcsb1001我的评论不建议使用其他方式。我的然而,评论确实指出了答案中的一个错误,声称“仅在包内访问”