有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java嵌套类:`OuterClass。这什么属性`?

嗨,我正在阅读myBatis的源代码,我的问题是我不理解SqlSessionManager.this.localSqlSession.get()这行代码。什么是SqlSessionManager.this的意思

我的尝试是:如果我在创建嵌套类时没有记错,比如A.B nestedObjectB = new A.B();,它实际上为它创建了一个对象A.B和一个匿名对象A。所以我猜SqlSessionManager.this类似于这里的对象A

(在SqlSessionManager.java

private class SqlSessionInterceptor implements InvocationHandler {
    public SqlSessionInterceptor() {
        // Prevent Synthetic Access
    }

    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
      final SqlSession sqlSession = SqlSessionManager.this.localSqlSession.get(); // *
      if (sqlSession != null) {
        try {
          return method.invoke(sqlSession, args);
        } catch (Throwable t) {
          throw ExceptionUtil.unwrapThrowable(t);
        }
      } else {
        try (SqlSession autoSqlSession = openSession()) {
          try {
            final Object result = method.invoke(autoSqlSession, args);
            autoSqlSession.commit();
            return result;
          } catch (Throwable t) {
            autoSqlSession.rollback();
            throw ExceptionUtil.unwrapThrowable(t);
          }
        }
      }
    }
  }

共 (1) 个答案

  1. # 1 楼答案

    SqlSessionManager.this指的是外部类,如果您只使用了this,它将指的是没有localSqlSessionSqlSessionInterceptor

    如果只使用localSqlSession,它将引用直接外部类。如果在SqlSessionManagerSqlSessionInterceptor之间有另一个外部类,那么它将引用该类而不是SqlSessionManager。添加SqlSessionManager.this显式声明使用SqlSessionManager

    见:https://stackoverflow.com/a/1816462/https://stackoverflow.com/a/5530293

    编辑:

    关于https://github.com/mybatis/mybatis-3/blob/master/src/main/java/org/apache/ibatis/session/SqlSessionManager.java#L347,这样做似乎只是为了可读性