JAVA反编译(一)

JAVA编译后的CLass是很容易被反编译的,网上这类工具也比较多。这里是用了DJ Java Decompiler工具。一般没有被混淆过的JAVA代码反编译后基本上都能正常阅读,也有少部分是工具无法完整反编译出来,会带一些JVM语言和label等。如果被混淆过的JAVA代码反编译后前面的情况会出现的更多一些,同时还会把私有变量、方法、类的名称混淆成不方便阅读。这里就记录一下反编译时常见的一些形式。

一、最常见是new一个对象赋给一个变量
JVM INSTR new #2   <Class ArrayList>;
        JVM INSTR dup ;
        JVM INSTR swap ;
        ArrayList();
        List tobeRemove;
        tobeRemove;

转化后代码为:
List tobeRemove=new ArrayList();

从上面反编译出来的代码可以看出JAVA里面new一个对象的过程。

二、比较复杂的对象创建语句
JVM INSTR new #48  <Class Area>;
        JVM INSTR dup ;
        JVM INSTR swap ;
        JVM INSTR new #49  <Class java.awt.geom.RoundRectangle2D$Float>;
        JVM INSTR dup ;
        JVM INSTR swap ;
        0.0F;
        0.0F;
        (float)(getWidth() - 1);
        (float)(getHeight() - 10);
        10F;
        10F;
        java.awt.geom.RoundRectangle2D.Float();
        Area();
        Area area;
        area;

转化后为:
Area area=new Area(new java.awt.geom.RoundRectangle2D.Float(0.0F,0.0F,(float)(getWidth() - 1),(float)(getHeight() - 10),10F,10F));


三、同步代码
HashMap hashmap = tasks;
        JVM INSTR monitorenter ;
        if(tasks.remove(new Integer(iTaskID)) == null)
            return false;
        hashmap;
        JVM INSTR monitorexit ;
        return false;
        hashmap;
        JVM INSTR monitorexit ;
        throw ;


转化后为:
synchronized (tasks) {
    		 if(tasks.remove(new Integer(iTaskID)) == null){
    	            return false;
    		 }else{
    		  return true;
    		 }
	 }

你可能感兴趣的:(java,jvm)