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
是A
D
,其中
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类是在不同的包中定义的,并且您不能访问实例上除公共字段以外的其他字段。