Javassist报告字段在构造函数初始化后为空
嗨,我试图拦截sun.security.ssl.ServerHandshaker
的负载并添加字节代码以打印几个私有字段。Javassist报告字段在构造函数初始化后为空
这里是我试图添加代码:
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这些字段应该在构造函数的末尾进行初始化。是什么赋予了?
您提到的字段未在构造函数中初始化。例如,如果您查看链接的源代码并搜索clnt_random
,则会发现它只设置在一个地方:clientHello
方法。 (clnt_random
在基类Handshaker
中定义,但Handshaker
不在任何位置初始化)。
由于clnt_random
是一个对象类型,它具有初始值null,并且在构造函数中的任何位置都没有为它指定新值,因此在调用代码时它仍然为空。
这样做,谢谢! –
在源代码中找不到任何东西。这是在这里开始的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.,\
...
这就是你的异常来源。
安全管理员是一件好事。不同的沙箱需要不同的安全管理器。例如安全地运行小程序就有一个Manger。
因为他没有提供他自己的安全管理器实例,*没有*安全管理器提供。什么例外? – EJP
我没有安全管理员,但谢谢! –
你确定他们正在初始化?它们不会在您链接的源代码中的任何位置初始化。 – Antimony