Java 如何读取CTM方法的数据
您好,我想读取一个方法的数据,我试图使用javassist和java代理通过字节码操作来更改该方法。 原因是我的程序(Web应用程序)无法工作() 现在没有人能帮助我。 所以我不想知道我的方法里面有什么也许有什么东西会产生错误。。。所以我想知道我是否可以阅读和打印CTM方法的内容 我的代码Java 如何读取CTM方法的数据,java,javassist,bytecode-manipulation,javaagents,Java,Javassist,Bytecode Manipulation,Javaagents,您好,我想读取一个方法的数据,我试图使用javassist和java代理通过字节码操作来更改该方法。 原因是我的程序(Web应用程序)无法工作() 现在没有人能帮助我。 所以我不想知道我的方法里面有什么也许有什么东西会产生错误。。。所以我想知道我是否可以阅读和打印CTM方法的内容 我的代码 private byte[] transformClass(Class classToTransform, byte[] b, String className) { if (className.s
private byte[] transformClass(Class classToTransform, byte[] b, String className) {
if (className.startsWith("de/example")) {
ClassPool pool = ClassPool.getDefault();
CtClass cl = null;
try {
cl = pool.makeClass(new ByteArrayInputStream(b));
} catch (IOException e) {
e.printStackTrace();
}
try {
assert cl != null;
for (CtMethod ctMethod : cl.getMethods()) {
changeMethod(ctMethod);
System.out.println(ctMethod.getMethodInfo());
System.out.println(ctMethod.getMethodInfo2());
}
b = cl.toBytecode();
} catch (Exception e) {
e.printStackTrace();
} finally {
if (cl != null) {
cl.detach();
}
}
}
return b;
}
private void changeMethod(CtMethod method) throws NotFoundException, CannotCompileException {
if (method.hasAnnotation(Loggable.class)) {
System.out.println(method.getMethodInfo());
System.out.println(method.getMethodInfo2());
method.insertBefore(" startTime = 0;\n" +
" startTime = System.currentTimeMillis();\n" +
" final de.example.webservice.ws.TestFolder.Logging threadLogger = de.example.webservice.ws.TestFolder.Logging.getInstance();\n" +
" Thread thread1 = new Thread(new Runnable(){\n" +
" @Override\n" +
" public void run() {\n" +
" threadLogger.info(\"Testlog\");\n" +
" try {\n" +
" threadLogger.logCall(Webservice.this.getClass().getMethod(\"startThread0\"),\"Thread\");\n" +
" } catch (Exception e) {\n" +
" e.printStackTrace();\n" +
" }\n" +
" }\n" +
" });\n" +
" thread1.start();");
}
}
我在google只找到一些方法,这些方法可以从.txt文件之类的文件中读取数据,但这对我的问题没有帮助。如果您试图读取该方法的原始源代码,javassist实际上不会这样做。您需要一个java字节码反编译器。谷歌这个词。jad是一个很好的插件。OK首先,我决定使用Java反编译器IntelliJ插件,因为它更新了,呵呵:数据真的足够了。忘了那个:)