代码之家  ›  专栏  ›  技术社区  ›  Jonathan S. Fisher

Javassist报告字段在构造函数中初始化后为空

  •  0
  • Jonathan S. Fisher  · 技术社区  · 7 年前

    嘿,伙计们,我正试图拦截 sun.security.ssl.ServerHandshaker

    以下是我试图添加的代码:

    public static final String printCLIENT_RANDOM_CODE = 
        "System.out.println(\"this.clnt_random:\"+this.clnt_random);\n"
            + "System.out.println(\"this.session:\"+this.session);";
    

    classfileBuffer 是原始字节码, className 是类名,并且 insertAfterJavaCode 将如上所述 printCLIENT_RANDOM_CODE

    private byte[] instrument(byte[] classfileBuffer, String className, String insertAfterJavaCode) throws Exception {
        System.out.println("Attempting to enhance " + className + "...");
        ClassPool cp = ClassPool.getDefault();
        cp.insertClassPath(new ByteArrayClassPath(className, classfileBuffer));
        CtClass cc = cp.get(className);
        CtConstructor[] declaredConstructors = cc.getDeclaredConstructors();
        for (CtConstructor con : declaredConstructors) {
            con.insertAfter(insertAfterJavaCode);
        }
        return cc.toBytecode();
    }
    

    然而,当它运行时,我得到了以下信息:

    Attempting to enhance sun.security.ssl.ServerHandshaker...
    this.clnt_random:null
    this.session:null
    

    source code

    2 回复  |  直到 7 年前
        1
  •  3
  •   Antimony    7 年前

    您提到的字段未在构造函数中初始化。如果您查看链接并搜索的源代码 clnt_random 例如,您会发现它只设置在一个位置: clientHello 方法( clnt_随机 在基类中定义 Handshaker 但是 握手器

    是一种对象类型,其初始值为null,并且在构造函数中的任何位置都没有为其分配新值,因此在调用代码时仍为null。

        2
  •  0
  •   user207421    7 年前

    你在源代码中找不到任何东西。这是 Java Security Manager

    由于您没有提供自己的安全管理器实例,因此提供了默认实例。默认Java安全管理器由配置 ${JAVA_HOME}/jre/lib/security/java.security . 在该文件中,您将看到以下几行:

    ...
    # List of comma-separated packages that start with or equal this string
    # will cause a security exception to be thrown when
    # passed to checkPackageAccess unless the
    # corresponding RuntimePermission ("accessClassInPackage."+package) has
    # been granted.
    package.access=sun.,\
                   com.sun.xml.internal.,\
    ...
    

    这就是你的例外产生的原因。

    安全经理是件好事。不同的沙盒需要不同的安全管理器。例如,有一个安全运行小程序的管理器。