在读取Java源代码时,ServerSocket中的checkOldImpl方法没有发现它实际上是有用的。通过名称,他检查了旧的Impl,但使用时已替换了impl。这里的旧指的是SocketImpl吗?是否执行旧版本?如果是这样,为什么新版本已经有新的SocketImpl`了?
jdk1.8
private void checkOldImpl() {
if (impl == null)
return;
// SocketImpl.connect() is a protected method, therefore we need to use
// getDeclaredMethod, therefore we need permission to access the member
try {
AccessController.doPrivileged(
new PrivilegedExceptionAction<Void>() {
public Void run() throws NoSuchMethodException {
impl.getClass().getDeclaredMethod("connect",SocketAddress.class,int.class);
return null;
}
});
} catch (java.security.PrivilegedActionException e) {
oldImpl = true;
}
}
答案 0 :(得分:0)
这段代码在做什么,是检查设置为impl
(SocketImpl
)的类本身是否声明了方法connect(SocketAddress a, int b)
(未继承)。
如果没有该方法,则getDeclaredMethod
会抛出NoSuchMethodException
。 PrivilegedActionException
将此异常转换为PrivilegedExceptionAction
。
因此,如果该方法不存在,则此代码将标志oldImpl
设置为值true
。此标志稍后用于做出一些决定。
要直接回答您的问题:
oldImpl
并不引用impl
的先前值-而是一个boolean
标志,指示impl
的当前值是否为“旧”(因为它没有特定的方法)