我试图使用Java字节码工程库ASM来执行静态分析.我有这种情况,我想检查分配给字段的变量.
我有MethodVisitor实现该visitFieldInsn()方法.我特意找这个putfield命令.那没问题.问题是,当我遇到时putfield,我希望能够访问将分配给该字段的变量.具体来说,我想访问有关变量类型的信息.
目前我真的只需要查看堆栈顶部的内容,但如果有更通用的方法来检查它,那就更好了.
有没有办法使用ASM来检查堆栈上的变量?
根据我对方法1中每个局部变量定义的理解,为此Locals指标添加了local.
资源 :
public class A {
public void a() {}
public static void b() {}
}
Run Code Online (Sandbox Code Playgroud)
生成的字节码:
Compiled from "A.java"
public class A extends java.lang.Object
SourceFile: "A.java"
minor version: 0
major version: 50
Constant pool:
const #1 = Method #3.#12; // java/lang/Object."<init>":()V
const #2 = class #13; // A
const #3 = class #14; // java/lang/Object
const #4 = Asciz <init>;
const #5 = Asciz ()V;
const #6 = Asciz Code;
const #7 = Asciz LineNumberTable;
const #8 = …Run Code Online (Sandbox Code Playgroud) 是否可以将x86 32位汇编代码转换为等效的JVM字节码并执行它?
我有.so形式的Fortran库.我想使用GDB对它执行汇编转储,然后使用某种转换器将其转换为有效的JVM字节码.
这甚至可能吗?
为简单起见,我们假设我不再关心平台独立性了.程序集和字节码都将在同一台机器上运行.
假设我在Scala中有以下内容
object Foo {
var functions: List[String => String] = Nil // can be any type to any type.
def addFunc(f:String => String) = functions = f :: functions
}
Run Code Online (Sandbox Code Playgroud)
在运行时,我会Foo添加一些函数.我现在想构建一个新的.class文件,在Scala中实现类似的跟随:
object MyObject {
def process1(s:String) = // call Foo.functions(1)
}
Run Code Online (Sandbox Code Playgroud)
然后我想保存MyObject字节码,即使Foo不存在也可以在以后执行.
以上只是展示我想做的事情的一个例子.我得到了名字MyObject,process1我必须生成一个可执行文件MyObject.class.MyObject不需要源(它可能是Java源代码).
因此,在高层次上,我们需要获取内存"快照" Foo.function(1),将该快照转换为字节码进行存储,并生成MyObject使用此字节码的字节码.
我发现的所有字节码工程库都太低级了,所以我想知道是否有更高级别的库可以让我处理抽象对象,如函数等.
我正在查看java字节码列表和维基百科,它们似乎都是基本操作(分支,推送,弹出,转换等).许多文章都使用这些基本示例.但是当我从控制台读取一行或创建一个新的JButton时会发生什么?打开端口的字节码在哪里?
我相信我看到了一些"系统调用"的东西(虽然我今天没有找到它,但却多次浏览一下这个列表).这些"特殊"调用是否有自己的代码,这些代码由VM直接委托给操作系统(技术上不知道如何说)?我知道有办法打开字节码,但我正在寻找一般解释,而不是数周学习高级字节码.
Cliff Click在他的演讲中,"JVM就是这样吗?","有更好的方法来描述语义而不是Java字节码":http://www.youtube.com/watch?v = uL2D3qzHtqY&t = 8m55s
为什么?Java字节码有什么问题?有哪些替代方案?
我有以下Java代码:
public int sign(int a) {
if(a<0) return -1;
else if (a>0) return 1;
else return 0;
}
Run Code Online (Sandbox Code Playgroud)
在编译时生成以下字节码:
public int sign(int);
Code:
0: iload_1
1: ifge 6
4: iconst_m1
5: ireturn
6: iload_1
7: ifle 12
10: iconst_1
11: ireturn
12: iconst_0
13: ireturn
Run Code Online (Sandbox Code Playgroud)
我想知道如何计算字节偏移计数(第一列),特别是当所有其他指令都是单字节指令时,为什么字节计数ifge和ifle指令3字节?
我写了一个简单的脚本test.py,包含:
print('hello')
Run Code Online (Sandbox Code Playgroud)
然后用python -O test.py它来运行它.我希望这能创建一个test.pyo文件,但事实并非如此.
我的版本是Python 3.5.2.为什么没有创建缓存文件?
Java代码:
public class SimpleRecursion {
public int factorial(int n) {
if (n == 0) {
return 1;
}
return n*factorial(n - 1);
}
}
Run Code Online (Sandbox Code Playgroud)
为factorial方法提供以下字节码(我执行javap来生成它):
Run Code Online (Sandbox Code Playgroud)public int factorial(int); descriptor: (I)I flags: ACC_PUBLIC Code: stack=4, locals=2, args_size=2 0: iload_1 1: ifne 6 4: iconst_1 5: ireturn 6: iload_1 7: aload_0 8: iload_1 9: iconst_1 10: isub 11: invokevirtual #2 // Method factorial:(I)I 14: imul 15: ireturn LineNumberTable: line 4: 0 line 5: 4 line 7: 6 StackMapTable: number_of_entries = 1 frame_type …