Java Can';t从子类访问受保护的方法
所以,我们有Java Can';t从子类访问受保护的方法,java,inheritance,classloader,Java,Inheritance,Classloader,所以,我们有 public abstract class A{ protected abstract String f(); } public class B extends A{ protected String f(){...} } public class C extends A{ protected String f(){ A b = (A) Class.forName("B", true, getClass().getClassLoade
public abstract class A{
protected abstract String f();
}
public class B extends A{
protected String f(){...}
}
public class C extends A{
protected String f(){
A b = (A) Class.forName("B", true, getClass().getClassLoader()).newInstance();
return b.f();
}
这不允许我访问
b.f()
,说b.f()
在受保护的范围内,但是f
受A
的保护,而且由于C
扩展了A
,它也应该可以访问f()
否,因为编译器不知道b
是否是b
、C
或其他外部类的实例
假设有一个类
D
,使得D扩展另一个包中的。如果b
是D
的实例(编译器不知道)b.f()
应该被禁止,如果访问受保护(其他包中的类无法访问) protected修饰符指定该成员只能在其自己的包内访问(与包private一样),此外,还可以由另一个包中其类的子类访问
如果要访问B.f(),应该在与B相同的包中定义C类。为什么不创建新实例,如:ab=(A)new B()?B仅在运行时可用。如果你真的想知道,B是com.android.okhttp.HttpsHandler
,A是URLStreamHandler
,你可以通过反射来解决你的问题,但如果你发布你原来的问题,会更有帮助。您正在尝试调用HttpsHandler
的哪种方法,以及为什么需要它。看。考虑一下你原来的问题来打开一个新的问题。难道你没有感觉到你做错了什么吗?如果是这样,你为什么要让事情变得更糟?因为这是唯一的办法。该类仅在运行时可用,此反射是在URL
中实际执行的方式,它与UrlStreamHandler
位于同一个包中。哦,我想我不能使用这个功能。我最初的问题是让所有HTTPS连接使用我的自定义证书。我想通过创建自己的URLStreamHandler来实现这一点,它将委托给默认的流处理程序来打开连接,如果协议是https,只需执行setSSLSocketFactory
。我的自定义URLStreamHandler
将被发送到URL.setURLStreamHandlerFactory。只要b是A,A有f
,这有什么关系?@doom777假设现在b
是AD
,其中D扩展了A
,并在另一个包中使用受保护的f()
方法定义。考虑到D
,A
在“另一个包”中,因此A
无法访问D
中受保护的方法。然而,编译人员不知道b
是b
、C
还是D
,因此b.f()
必须被禁止(如果b
是D
的一个实例)。我认为,因为f
最初是在A
中定义的,它应始终作为a
的子级或更自由的子级,并可供所有a
s及其子级使用subclasses@doom777由于D
不是C
的子类,因此D
中的f()
对C
不可用我认为不应该,因为它最初是在A
中定义的,所以它在C中受保护实际上意味着受A
的保护,并且它应该对A
的所有子类都可用。但是这种可访问性级别可以通过不使用修饰符(称为“包私有”)来实现。如果访问受保护方法的子类必须位于同一个包中,这是否意味着包私有修饰符和受保护修饰符的作用相同?我认为访问受保护方法的子类可以在任何包中。如果我不对,请纠正我。你是对的。答案试图解决问题中所述的问题。现在我明白了。但是变量b的类型是A,并且b()的实例被强制转换为A。这一刻很有趣,为什么访问是非法的,这是因为C类是在不同的包中定义的,并且您不能访问实例上除公共字段以外的其他字段。