Java 访问父类的子类中静态类的受保护成员
类ExtendedDismaxQParser有一个静态成员类子句: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
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我的评论不建议使用其他方式。我的然而,评论确实指出了答案中的一个错误,声称“仅在包内访问”