Byte Code Engineering Library (BCEL),这是Apache Software Foundation 的Jakarta 项目的一部分。BCEL是 Java classworking 最广泛使用的一种框架,它可以让您深入 JVM 汇编语言进行类操作的细节。BCEL与Javassist 有不同的处理字节码方法,BCEL在实际的JVM 指令层次上进行操作(BCEL拥有丰富的JVM 指令级支持)而Javassist 所强调的源代码级别的工作。
public class BcelTest1{
int a=1111;
int x=2222;
public void put(){
int b=1111;
}
public void output(){
int e=99999;
int f=88888;
int g=77777;
}
}
我现在要做的就是能对上面.java转换成的.class文件进行操作.最后要得到的结果就是能过对BcelTest1.class的操作.能够提取出 a=1,x=5,e=2,f=2,g=3.当然,如果是final时是可以很轻松得到的.但它们都是很基本的.所以可能要在jvm层层级操作.我现在正在找实现的方法.下面
import java.io.IOException;
import org.apache.bcel.classfile.*;
//import org.apache.bcel.generic.ClassGen;
//import org.apache.bcel.*;
import com.sun.org.apache.bcel.internal.classfile.Attribute;
import com.sun.org.apache.bcel.internal.classfile.LocalVariable;
import com.sun.org.apache.bcel.internal.classfile.Visitor;
/**
* @author Administrator
*
*/
public class BcelTest {
public static void main(String[] arg) {
try {
ClassParser cla = new ClassParser("E:\\java\\BcelTest1.class");
JavaClass jClass = cla.parse();
Method method[] = jClass.getMethods();
for(int i = 0;i<method.length;i++){
Code aCode = method[i].getCode();
System.out.println(aCode.toString());
}
} catch (IOException e) {
System.out.println(e.toString());
}
}
}
运行结果为:
Code(max_stack = 2, max_locals = 1, code_length = 19)
0: aload_0
1: invokespecial java.lang.Object.<init> ()V (1)
4: aload_0
5: sipush 1111
8: putfield BcelTest1.a I (2)
11: aload_0
12: sipush 2222
15: putfield BcelTest1.x I (3)
18: return
Attribute(s) =
LineNumber(0, 1), LineNumber(4, 2), LineNumber(11, 3)
Code(max_stack = 1, max_locals = 2, code_length = 5)
0: sipush 1111
3: istore_1
4: return
Attribute(s) =
LineNumber(0, 5), LineNumber(4, 6)
Code(max_stack = 1, max_locals = 4, code_length = 10)
0: ldc 99999 (4)
2: istore_1
3: ldc 88888 (5)
5: istore_2
6: ldc 77777 (6)
8: istore_3
9: return
Attribute(s) =
LineNumber(0, 8), LineNumber(3, 9), LineNumber(6, 10), LineNumber(9, 11)
我现在想的就是提取方法里面变量的值.但是还没有成功.
知道的帮助一下呀.先谢谢了..
public class BcelTest1{
int a=1111;
int x=2222;
public void put(){
int b=1111;
}
public void output(){
int e=99999;
int f=88888;
int g=77777;
}
}
我现在要做的就是能对上面.java转换成的.class文件进行操作.最后要得到的结果就是能过对BcelTest1.class的操作.能够提取出 a=1,x=5,e=2,f=2,g=3.当然,如果是final时是可以很轻松得到的.但它们都是很基本的.所以可能要在jvm层层级操作.我现在正在找实现的方法.下面
import java.io.IOException;
import org.apache.bcel.classfile.*;
//import org.apache.bcel.generic.ClassGen;
//import org.apache.bcel.*;
import com.sun.org.apache.bcel.internal.classfile.Attribute;
import com.sun.org.apache.bcel.internal.classfile.LocalVariable;
import com.sun.org.apache.bcel.internal.classfile.Visitor;
/**
* @author Administrator
*
*/
public class BcelTest {
public static void main(String[] arg) {
try {
ClassParser cla = new ClassParser("E:\\java\\BcelTest1.class");
JavaClass jClass = cla.parse();
Method method[] = jClass.getMethods();
for(int i = 0;i<method.length;i++){
Code aCode = method[i].getCode();
System.out.println(aCode.toString());
}
} catch (IOException e) {
System.out.println(e.toString());
}
}
}
运行结果为:
Code(max_stack = 2, max_locals = 1, code_length = 19)
0: aload_0
1: invokespecial java.lang.Object.<init> ()V (1)
4: aload_0
5: sipush 1111
8: putfield BcelTest1.a I (2)
11: aload_0
12: sipush 2222
15: putfield BcelTest1.x I (3)
18: return
Attribute(s) =
LineNumber(0, 1), LineNumber(4, 2), LineNumber(11, 3)
Code(max_stack = 1, max_locals = 2, code_length = 5)
0: sipush 1111
3: istore_1
4: return
Attribute(s) =
LineNumber(0, 5), LineNumber(4, 6)
Code(max_stack = 1, max_locals = 4, code_length = 10)
0: ldc 99999 (4)
2: istore_1
3: ldc 88888 (5)
5: istore_2
6: ldc 77777 (6)
8: istore_3
9: return
Attribute(s) =
LineNumber(0, 8), LineNumber(3, 9), LineNumber(6, 10), LineNumber(9, 11)
我现在想的就是提取方法里面变量的值.但是还没有成功.
知道的帮助一下呀.先谢谢了..
但也不知道怎么提取.