Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/320.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java字节码插装到ASPECTJ标识的方法_Java_Aspectj_Instrumentation - Fatal编程技术网

Java字节码插装到ASPECTJ标识的方法

Java字节码插装到ASPECTJ标识的方法,java,aspectj,instrumentation,Java,Aspectj,Instrumentation,我有一个遗留java代码,目前无法修改/无法访问其源代码。 我们发现所有具有名为@SomeAnnotation的运行时注释的方法都存在问题,我们希望修复这些方法内部的一些问题 @SomeAnnotation void someMethod(...) { ... } 我知道我可以使用AOP(aspectJ)捕获带有这些注释的所有函数,并在之前/之后添加操作,以及用其他内容替换执行代码。。。但是我想做的是在这个函数中添加一些东西,剩下的代码也一样(扫描字节码和修改中间函数…)< /P>

我有一个遗留java代码,目前无法修改/无法访问其源代码。 我们发现所有具有名为@SomeAnnotation的运行时注释的方法都存在问题,我们希望修复这些方法内部的一些问题

@SomeAnnotation
void someMethod(...) {
     ...

}
我知道我可以使用AOP(aspectJ)捕获带有这些注释的所有函数,并在之前/之后添加操作,以及用其他内容替换执行代码。。。但是我想做的是在这个函数中添加一些东西,剩下的代码也一样(扫描字节码和修改中间函数…)< /P> 有可能吗?如果是的话-如何

谢谢

您可以试试——它是一个用于在Java中编辑字节码的类库;它使Java程序能够在运行时定义一个新类,并在JVM加载类文件时修改它

或 -它允许更改方法体、添加/重命名方法/字段

此外,您可能会发现它很有用

(根据您需要执行的操作(在开始时添加一些代码,执行函数的其余部分,在末尾添加一些代码,而不是在中间修改函数),您可能能够使用一个带有
ProceedingJoinPoint调用的环绕建议

作为一个参数,您可以执行代码,然后调用
invocation.procedure()
将调用委托给原始目标。)

我通过
javap-verbose
查看java类以查找我要编辑的代码,并通过vim使用命令
:%对其进行编辑!xxd
。我很幸运做了那件工作。@xxxzhi谢谢。我不想用vim手动修改文件。我想自动注入代码。请更具体一些。你到底想替换什么?方法调用?最终结果如何?您希望更换/修复的这些方法有哪些共同点?请举一个尽可能具体的例子。然后我可以告诉你AspectJ是否有能力做到这一点。具体的答案需要具体的问题。旧的原则适用:垃圾输入,垃圾输出。我只知道在运行时替换什么,当加载应用程序时,我会得到一个包含要替换的方法调用的文件。Aspectj不能在AFAIK中实现这一点,除非有一种方法可以在其中操纵字节码。我无法在advanced中创建方法adpects,我只知道它们位于哪个函数中…(带有注释的函数)谢谢@laura,我知道我可以用javassist完成这项工作,并检查所有的类和所有的字节码——但我真的想避免这种情况,并使用aspectJ这样的工具,这样我就可以完成这项工作,而不用自己检查所有的类。主要的问题是,我需要在函数的中间替换一些东西(否则它将是简单的AOP)。HotSwap允许我用一个方法替换一个方法,而不是一次操作一个现有的方法。似乎除了检查所有字节码之外,没有其他方法可以实现我想要的(或者使用反编译器…)