我工作的地方,我们正在做大量的Java服务和客户用其它各种语言之间的远程对象转移的项目.鉴于我们目前的限制,我已经决定要看看它会采取基于现有的Java类代码.基本上,我需要一个.class文件(或它们的集合)解析字节码,以确定所有的数据成员,或许getter/setter方法,然后写的东西,可以在不同的语言输出的代码来创建一个类具有相同的结构.
我不是在寻找像JAD这样的标准反编译器.我需要能够获取.class文件并创建其数据成员和方法的对象模型.这有可能吗?
为什么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) 我正在研究自己的JVM实现,并开始接受checkcast指令.完整文档在此页面上.我很好奇,因为在枚举演员如何工作的规则时,检查的一个条件是被检查的对象引用是否是接口类型.据我了解,这是不可能的; 接口不能直接实例化,实现接口的任何对象都有其他一些具体的类类型.我错过了什么吗?
我看到了http://vmkit.llvm.org/项目,但它并不是我想要的.不希望我的代码在另一个VM上运行,而是在.NET和Java的VM上运行.
是否有任何生成.NET CIL和/或Java字节码的LLVM编译器后端?
如何使用Python 2.7重新编译Python 2.5生成的一些.pyc文件?
我没有源文件,我无法获取它.
我正在寻找一个免费的解决方案.
我们的项目执行一些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".
我的问题是:
我正在使用自己的玩具编程语言.现在我正在解释AST的源语言,我想知道编译一个字节码然后解释它有什么好处可以提供给我.
现在我有三件事:
我的观点是否正确?编译到字节码背后有什么其他动机?
我尝试为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) 我一直在考虑检查jar文件的哈希值,以确定它是否已经改变,但事实证明,每次构建它时,相同的jar文件都有不同的哈希值(从eclipse导出为jar文件,或者使用maven构建它) ).我删除了清单文件的日期值和内容,但它仍然不同.字节码生成中是否包含时间戳或其他内容?
bytecode ×10
java ×6
python ×3
interpreter ×2
.net ×1
annotations ×1
casting ×1
cil ×1
decompiling ×1
interface ×1
jar ×1
java-8 ×1
jvm ×1
llvm ×1
maven ×1