标签: bytecode-manipulation

是否可以查看Class文件的字节码?

可能重复:
是否有java类文件/字节码编辑器来编辑指令?

Java源代码被编译成字节码,实际上是在类文件中.是否可以查看已编译类的字节码?

如果可能,可以编辑吗?

是否有可用的eclipse插件?

java bytecode bytecode-manipulation

98
推荐指数
4
解决办法
7万
查看次数

是否有java类文件/字节码编辑器来编辑指令?

是否有用于编辑java类文件的实用程序(或eclipse插件)?我想操纵java类文件的字节码而不重新编译它,也没有完整的构建路径.

例如,重命名方法,添加/删除指令,更改常量等.

我找到的唯一工具是:

  • 类编辑 ,但它在功能上非常有限的(如物联网和操作说明改名是不可能的).

  • jbe不保存更改(可能因为类验证失败 - 在我进行任何更改之前,尽管类运行完美)

    (jbe最初有一个类路径问题,将jbe.bat文件的类路径添加到了帮助中)

java bytecode bytecode-manipulation decompiler .class-file

30
推荐指数
3
解决办法
2万
查看次数

动态Java字节码操作框架比较

有一些框架用于动态字节码生成,操作和编织(BCEL,CGLIB,javassist,ASM,MPS).我想了解它们,但由于我没有太多时间知道所有这些细节,我希望看到一种比较图表,说明一种与其他的优缺点,以及对为什么.

在SO中,我发现了许多类似问题的问题,答案通常说"你可以使用cglib或ASM",或者"javassist比cglib更好",或者"BCEL已经老了,正在死"或"ASM是最好的,因为它给出X和Y".这些答案很有用,但并没有完全回答我想要的范围内的问题,更深入地比较它们并给出每个问题的优点和缺点.

bytecode-manipulation cglib javassist java-bytecode-asm jvm-bytecode

29
推荐指数
3
解决办法
5917
查看次数

如何扩展Java以引入通过引用传递?

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

27
推荐指数
4
解决办法
2849
查看次数

erlang BEAM字节码

好吧,我希望我不会在这里打破一些垃圾邮件规则.我刚问了一个关于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编译器破坏了什么.

非常感谢

erlang bytecode bytecode-manipulation beam

18
推荐指数
2
解决办法
5748
查看次数

是否有Scala意识到像Javassist这样的高级字节码操作工具?

我正在寻找像Javassist这样的高级字节码操作工具,但它了解Scala的一些特性.较低级别的字节码操作工具应该是相对不可知的,但对于我的用例,Javassist级别的东西要好得多.但是,该级别的工具需要了解源语言及其字节码映射.Scala有这样的东西吗?到目前为止,我已经能够将Javassist与Scala一起用于非常简单的事情,但是我已经被一些Scala/Java差异所困扰了其他一些事情.

scala bytecode bytecode-manipulation javassist

17
推荐指数
1
解决办法
781
查看次数

在编译的类中没有反射的序列化

由于客户端JVM的限制,我不能使用任何流行的序列化器,因为不支持反射.我正在寻找一种工具,通过将编写器和读取器方法注入已编译的类来执行字节码操作以实现序列化.我需要字节码操作java代码将它与我的构建过程代码绑定.

我一直这样做是通过生成代码并将其注入源代码,然后再编译使用我的自定义序列化程序.我想避免这种方法,因为我不想以任何方式修改源文件.

我知道Kryo和其他XML和JSON序列化程序,但它们不符合我的需求.

谢谢.

java serialization code-generation bytecode-manipulation

17
推荐指数
2
解决办法
870
查看次数

Java字节码操作库建议

我正在寻找一个维护良好的Java字节码操作库和一个直观的API.那里似乎有很多人.有关哪些尝试的建议?

java frameworks bytecode-manipulation

13
推荐指数
1
解决办法
3539
查看次数

Oracle和Eclipse编译器生成的java字节码的差异

我们的项目执行一些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".

我的问题是:

  1. 是否有一些不同编译器之间的差异概述?文章/博客文章?
  2. 我可以安全地得出结论,如果"new"和"invokespecial"之间没有"dup",那么初始化后不会使用对象吗?

java bytecode bytecode-manipulation

12
推荐指数
2
解决办法
734
查看次数

Java中的字节码分析

我正在开发一个字节码分析项目,我正在使用ASM.一切都很顺利,我能够成功解析,获得类和方法信息.

但我坚持理解泛型的字节码表示.下面是一个例子java.util.list,当我使用visitMethodClassVisitor打印的信息,这是我得到的方法的签名之一:

(ILjava/util/Collection<+TE;>;)Z
Run Code Online (Sandbox Code Playgroud)

在这里,我试图逐个反汇编并理解方法的参数:

  • I 代表int
  • Ljava/util/Collection 代表它是一种类型的论证 Collection

但我被困在仿制药类型<+TE>等等.任何人都可以指导我吗?我试图搜索但没有得到足够的信息.如果有人有字节码名称列表,请分享一下吗?

java bytecode bytecode-manipulation java-bytecode-asm

12
推荐指数
1
解决办法
2495
查看次数