是否有用于编辑java类文件的实用程序(或eclipse插件)?我想操纵java类文件的字节码而不重新编译它,也没有完整的构建路径.
例如,重命名方法,添加/删除指令,更改常量等.
我找到的唯一工具是:
有一些框架用于动态字节码生成,操作和编织(BCEL,CGLIB,javassist,ASM,MPS).我想了解它们,但由于我没有太多时间知道所有这些细节,我希望看到一种比较图表,说明一种与其他的优缺点,以及对为什么.
在SO中,我发现了许多类似问题的问题,答案通常说"你可以使用cglib或ASM",或者"javassist比cglib更好",或者"BCEL已经老了,正在死"或"ASM是最好的,因为它给出X和Y".这些答案很有用,但并没有完全回答我想要的范围内的问题,更深入地比较它们并给出每个问题的优点和缺点.
bytecode-manipulation cglib javassist java-bytecode-asm jvm-bytecode
Java是按值传递的.你如何修改语言以引入通过引用传递(或一些等效的行为)?
举个例子
public static void main(String[] args) {
String variable = "'previous String reference'";
passByReference(ref variable);
System.out.println(variable); // I want this to print 'new String reference'
}
public static void passByReference(ref String someString) {
someString = "'new String reference'";
}
Run Code Online (Sandbox Code Playgroud)
哪个(没有ref)编译成以下字节码
public static void main(java.lang.String[]);
Code:
0: ldc #2 // String 'previous String reference'
2: astore_1
3: aload_1
4: invokestatic #3 // Method passByReference:(Ljava/lang/String;)V
7: return
public static void passByReference(java.lang.String);
Code:
0: ldc #4 // String …Run Code Online (Sandbox Code Playgroud) java bytecode language-design pass-by-reference bytecode-manipulation
好吧,我希望我不会在这里打破一些垃圾邮件规则.我刚问了一个关于erlang编译器如何实现模式匹配的问题,我得到了一些很好的响应,其中一个是编译后的字节码(通过传递给c()指令的参数获得):
{function, match, 1, 2}.
{label,1}.
{func_info,{atom,match},{atom,match},1}.
{label,2}.
{test,is_tuple,{f,3},[{x,0}]}.
{test,test_arity,{f,3},[{x,0},2]}.
{get_tuple_element,{x,0},0,{x,1}}.
{test,is_eq_exact,{f,3},[{x,1},{atom,a}]}.
return.
{label,3}.
{badmatch,{x,0}}
Run Code Online (Sandbox Code Playgroud)
它只是简单的二郎元组.我期待一些神秘的二元东西,猜不是.所以我在这里冲动地问这个问题(我可以看一下编译器的来源但是问题总是会因为额外的洞察力而变得更好),这个输出如何在二进制级别翻译?
说{test,is_tuple,{f,3},[{x,0}]}的例子.我假设这是一条指令,称为'test'...无论如何,所以这个输出本质上是字节码级语言的AST,二进制编码只是1-1的翻译?这一切都是如此令人兴奋,我不知道我能否轻松地看到erlang编译器破坏了什么.
非常感谢
我正在寻找像Javassist这样的高级字节码操作工具,但它了解Scala的一些特性.较低级别的字节码操作工具应该是相对不可知的,但对于我的用例,Javassist级别的东西要好得多.但是,该级别的工具需要了解源语言及其字节码映射.Scala有这样的东西吗?到目前为止,我已经能够将Javassist与Scala一起用于非常简单的事情,但是我已经被一些Scala/Java差异所困扰了其他一些事情.
由于客户端JVM的限制,我不能使用任何流行的序列化器,因为不支持反射.我正在寻找一种工具,通过将编写器和读取器方法注入已编译的类来执行字节码操作以实现序列化.我需要字节码操作java代码将它与我的构建过程代码绑定.
我一直这样做是通过生成代码并将其注入源代码,然后再编译使用我的自定义序列化程序.我想避免这种方法,因为我不想以任何方式修改源文件.
我知道Kryo和其他XML和JSON序列化程序,但它们不符合我的需求.
谢谢.
我正在寻找一个维护良好的Java字节码操作库和一个直观的API.那里似乎有很多人.有关哪些尝试的建议?
我们的项目执行一些Java字节码检测.我们偶然发现了一些奇怪的行为.假设以下代码段:
public void a() {
new Integer(2);
}
Run Code Online (Sandbox Code Playgroud)
Oracle的javac将上面的代码编译成以下字节码:
0: new #2; //class java/lang/Integer
3: dup
4: iconst_2
5: invokespecial #3; //Method java/lang/Integer."<init>":(I)V
8: pop
9: return
Run Code Online (Sandbox Code Playgroud)
和Eclipse的编译器进入:
0: new #15; //class java/lang/Integer
3: iconst_2
4: invokespecial #17; //Method java/lang/Integer."<init>":(I)V
7: return
Run Code Online (Sandbox Code Playgroud)
如您所见,Oracle编译器在"new"之后生成"dup",而Eclipse则不然.在这个用例中完全正确,因为根本不使用新创建的Integer实例,因此不需要"dup".
我的问题是:
我正在开发一个字节码分析项目,我正在使用ASM.一切都很顺利,我能够成功解析,获得类和方法信息.
但我坚持理解泛型的字节码表示.下面是一个例子java.util.list,当我使用visitMethod从ClassVisitor打印的信息,这是我得到的方法的签名之一:
(ILjava/util/Collection<+TE;>;)Z
Run Code Online (Sandbox Code Playgroud)
在这里,我试图逐个反汇编并理解方法的参数:
I 代表intLjava/util/Collection 代表它是一种类型的论证 Collection但我被困在仿制药类型<+TE>等等.任何人都可以指导我吗?我试图搜索但没有得到足够的信息.如果有人有字节码名称列表,请分享一下吗?
bytecode ×7
java ×7
javassist ×2
.class-file ×1
beam ×1
cglib ×1
decompiler ×1
erlang ×1
frameworks ×1
jvm-bytecode ×1
scala ×1