现在的位置: 首页 > 综合 > 正文

java反编译

2012年12月10日 ⁄ 综合 ⁄ 共 1162字 ⁄ 字号 评论关闭

很简单的一个测试类如下:

 源码:                                                                                       编译生成的Class文件:
public class testOuter {
   private int a;
   private int b;
   
   private void fun() {
       a += 1;
   }

   class testInner {
       int x = 0;
       testInner() {
           b = 1;
           a = 0;
           fun();
       }
   }

 

class testOuter$testInner {
    int x = 0;
    testOuter$testInner(testOuter paramtestOuter) {
        testOuter.access$002(paramtestOuter, 1);
        testOuter.access$102(paramtestOuter, 0);
        testOuter.access$200(paramtestOuter);
    }
}

 

可以看出,为了使内部类访问外部类的私有成员,编译器生成了形似 "外部类.access$XYZ"的函数。XYZ为数字。X是按照私有成员在内部类出现的顺序递增的。YZ为02的话,标明是基本变量成员;YZ为00的话标明是对象成员或者函数。

记录一下,编译反编译看代码时理解代码!

public  class Outer{                                            //  this$0

        public class FirstInner{                             //  this$1

                public class SecondInner{               //  this$2

                                      public class ThirdInner{

                                                    

                                      }

                       }

        }

}

java.net.URLClassLoader$1.run  代表的是第一个内部类中的run方法

sun.misc.Launcher$AppClassLoader.loadClass执行了Launcher的内部类AppClassLoader中的loadClass方法

参考文章:http://hi.baidu.com/haoziqi/item/cb743096d54791bc82d2952e

抱歉!评论已关闭.