标签: bytecode

以编程方式检查.class文件

我工作的地方,我们正在做大量的Java服务和客户用其它各种语言之间的远程对象转移的项目.鉴于我们目前的限制,我已经决定要看看它会采取基于现有的Java类代码.基本上,我需要一个.class文件(或它们的集合)解析字节码,以确定所有的数据成员,或许getter/setter方法,然后写的东西,可以在不同的语言输出的代码来创建一个类具有相同的结构.

我不是在寻找像JAD这样的标准反编译器.我需要能够获取.class文件并创建其数据成员和方法的对象模型.这有可能吗?

java decompiling bytecode

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

为什么python在解释之前将源代码编译为字节码?

为什么python在解释之前将源代码编译为字节码?

为什么不直接从源头解释?

python compiler-construction interpreter bytecode

12
推荐指数
4
解决办法
4086
查看次数

如何从Python中的代码对象生成模块对象

鉴于我有一个模块的代码对象,我如何获得相应的模块对象?

它看起来像是moduleNames = {}; exec code in moduleNames非常接近我想要的东西.它将模块中声明的全局变量返回到字典中.但是,如果我想要实际的模块对象,我该如何获得它?

编辑:看起来你可以滚动自己的模块对象.模块类型不方便记录,但您可以执行以下操作:

import sys
module = sys.__class__
del sys
foo = module('foo', 'Doc string')
foo.__file__ = 'foo.pyc'
exec code in foo.__dict__
Run Code Online (Sandbox Code Playgroud)

python bytecode

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

对checkcast字节码指令的困惑?

我正在研究自己的JVM实现,并开始接受checkcast指令.完整文档在此页面上.我很好奇,因为在枚举演员如何工作的规则时,检查的一个条件是被检查的对象引用是否是接口类型.据我了解,这是不可能的; 接口不能直接实例化,实现接口的任何对象都有其他一些具体的类类型.我错过了什么吗?

java jvm casting bytecode interface

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

LLVM CIL和Java字节码后端

我看到了http://vmkit.llvm.org/项目,但它并不是我想要的.不希望我的代码在另一个VM上运行,而是在.NET和Java的VM上运行.

是否有任何生成.NET CIL和/或Java字节码的LLVM编译器后端?

.net java cil bytecode llvm

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

如何将Python 2.5字节码重新编译为2.7?

如何使用Python 2.7重新编译Python 2.5生成的一些.pyc文件?

我没有源文件,我无法获取它.

我正在寻找一个免费的解决方案.

python bytecode

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

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
查看次数

编译为字节码的动机是什么?

我正在使用自己的玩具编程语言.现在我正在解释AST的源语言,我想知道编译一个字节码然后解释它有什么好处可以提供给我.

现在我有三件事:

  • 遍历语法树数百次可能比运行阵列中的指令慢,特别是如果阵列支持O(1)随机访问(即上下跳过10条指令).
  • 在类型化的执行环境中,我有一些运行时成本,因为我输入了AST,并且我经常遍历它(即我有10种类型的节点,我需要检查我现在要执行的类型).也许编译成无类型的字节码可能有助于改善这一点,因为在类型检查和编译之后,我会有一个无类型的值和代码.
  • 编译为字节代码可以提供更好的可移植性.

我的观点是否正确?编译到字节码背后有什么其他动机?

interpreter bytecode abstract-syntax-tree

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

Java注释的默认值是否编译为字节码?

我尝试为Java字节码实现几个静态分析.他们试图计算某个方法是否具有特定属性,例如是工厂方法.因为这些分析很难测试,所以我决定编写一些Java代码并使用正确的属性直接注释方法.运行分析后,很容易自动检查计算属性和带注释的属性是否相同.

MyAnnotation:

@Retention(RUNTIME)
@Target(METHOD)
public @interface FactoryMethodProperty {

    FactoryMethodKeys value() default FactoryMethodKeys.NonFactoryMethod;
}
Run Code Online (Sandbox Code Playgroud)

示例测试代码:

public class PublicFactoryMethod {

    private PublicFactoryMethod(){
        // I'm private
    }

    @FactoryMethodProperty
    public static void newInstanceAfterOtherConstructorCall(){
        new TransFacoryMethod();
        new PublicFactoryMethod();
    }

    @FactoryMethodProperty(FactoryMethodKeys.IsFactoryMethod)
    public static PublicFactoryMethod newInstance(){
        return new PublicFactoryMethod();
    }
}
Run Code Online (Sandbox Code Playgroud)

因为我的测试代码中的大多数方法都不是工厂方法,所以我将默认设置为枚举值"FactoryMethodKeys.NonFactoryMethod".但是当我没有将枚举值显式传递给注释时,它不会被编译为字节码.

字节码:

 #23 = Utf8               value
  #24 = Utf8               Lorg/opalj/fpa/test/annotations/FactoryMethodKeys;
  #25 = Utf8               IsFactoryMethod

{
  public static void newInstanceAfterOtherConstructorCall();
    descriptor: ()V
    flags: ACC_PUBLIC, ACC_STATIC
    RuntimeVisibleAnnotations:
      0: #16()
    Code:
      stack=1, locals=0, args_size=0
         0: new           #17                 // class …
Run Code Online (Sandbox Code Playgroud)

java annotations bytecode java-8

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

为什么每次构建时,相同的JAR文件都有不同的哈希值?

我一直在考虑检查jar文件的哈希值,以确定它是否已经改变,但事实证明,每次构建它时,相同的jar文件都有不同的哈希值(从eclipse导出为jar文件,或者使用maven构建它) ).我删除了清单文件的日期值和内容,但它仍然不同.字节码生成中是否包含时间戳或其他内容?

java bytecode jar maven

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