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)
我现在想的就是提取方法里面变量的值.但是还没有成功.
知道的帮助一下呀.先谢谢了..