ServerSoket的checkOldImpl方法有什么用?

时间:2019-01-16 04:31:35

标签: java

在读取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;
    }
}

1 个答案:

答案 0 :(得分:0)

这段代码在做什么,是检查设置为implSocketImpl)的类本身是否声明了方法connect(SocketAddress a, int b)(未继承)。

如果没有该方法,则getDeclaredMethod会抛出NoSuchMethodExceptionPrivilegedActionException将此异常转换为PrivilegedExceptionAction

因此,如果该方法不存在,则此代码将标志oldImpl设置为值true。此标志稍后用于做出一些决定。

要直接回答您的问题:

  • oldImpl并不引用impl的先前值-而是一个boolean标志,指示impl的当前值是否为“旧”(因为它没有特定的方法)