用Java Instrumentation在类加载时添加记录 - 编程入门网
null;
try {
cl = pool.makeClass(new java.io.ByteArrayInputStream(b));
if (cl.isInterface() == false) {
CtField field = CtField.make(def, cl);
String getLogger = "java.util.logging.Logger.getLogger("
+ name.replace(''/'', ''.'') + ".class.getName());";
cl.addField(field, getLogger);
CtBehavior[] methods = cl.getDeclaredBehaviors();
for (int i = 0; i < methods.length; i++) {
if (methods[i].isEmpty() == false) {
doMethod(methods[i]);
}
}
b = cl.toBytecode();
}
} catch (Exception e) {
System.err.println("Could not instrument " + name
+ ", exception : " + e.getMessage());
} finally {
if (cl != null) {
cl.detach();
}
} return b;
}
doClass(...) 方法使用 Javassist 分析提供的字节流。如果它是一个实际类(与接口相对),则会添加一个名为 _log 的记录器字段,并初始化为类名称。每个非空方法通过 doMethod(...) 处理。 finally 语句确保类定义从 Javassist 池中删除以减少内存占用。
用Java Instrumentation在类加载时添加记录(5)时间:2011-03-05doMethod(...) 类创建 if (_log.isLoggable(INFO))_log.info(...) 代码并插入到每个方法的开头和结尾。选择这个级别作为无需任何记录系统配置就可生成输出的最低级别。 需要注意的是 JavassistHelper 类在示例代码 .zip 文件中是可用的。(请参阅 参考资料) 示例 MANIFEST.MF 文件 此处,只需要两行:一行通过 premain 方法指出类,另一行使 Javassist 可用于代理。 Premain-Class: com.runjva.instrumentation.LoggerAgentBoot-Class-Path: ../lib/javassist.jar 需要注意,dist/loggeragent.jar 需要 lib/javassist.jar,即 ../lib 相对路径。 示例 build.xml 文件 build.xml 文件包含一个编译目标、一个 .jar 目标、一个传统的 HelloWorld 目标和一个具有记录器代理活动的 HelloWorld 目标。
|
凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢! |