Konloch / bytecode-viewer

A Java 8+ Jar & Android APK Reverse Engineering Suite (Decompiler, Editor, Debugger & More)
https://bytecodeviewer.com
GNU General Public License v3.0
14.67k stars 1.15k forks source link

Unavailable Anonymous Inner Class #85

Closed yuxh closed 3 years ago

yuxh commented 9 years ago

I tried bytecode-viewer 2.9.8 to open class file ,but none of engine can decompile inner class.for example, using Procyon engine: CommMessageGather.scheduledThreadPoolExecutor.execute((Runnable)new CommMessageGather.CommMessageGather$1(this, interCommMessageBean)); using CFR engine: scheduledThreadPoolExecutor.execute((Runnable)new /* Unavailable Anonymous Inner Class!! */); But I tried both cfr_0_102 and procyon-decompiler-0.5.30,it works well: CommMessageGather.scheduledThreadPoolExecutor.execute(new Runnable() { @Override public void run() { CommMessageGather.this.sendInterCommLogProducer.send((Serializable)interCommMess ageBean); } });

maaatts commented 9 years ago

Could you post the class, or the bytecode for the class that doesn't get decompiled?

yuxh commented 9 years ago

this is bytecode copyed from Bytecode Viewer : public final class com/co/m2m/alarmgather/CommMessageGather implements java/io/Serializable {

 private static final long serialVersionUID = -5421099315944264558 (java.lang.Long);
 private static final int THREADPOOL_COUNT = 30 (java.lang.Integer);
 private static java.util.concurrent.ScheduledThreadPoolExecutor scheduledThreadPoolExecutor;
 private transient com.co.m2m.base.jms.producor.NotifyMessageProducer sendInterCommLogProducer;

 public CommMessageGather() { // <init> //()V
     <localVar:index=0 , name=this , desc=Lcom/co/m2m/alarmgather/CommMessageGather;, sig=null, start=L1, end=L2>

     L1 {
         aload0 // reference to self
         invokespecial java/lang/Object <init>(()V);
         return
     }
     L2 {
     }
 }

 public sendCommMessage(java.lang.String arg0, java.lang.String arg1, java.lang.String arg2) { //(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V
     <localVar:index=0 , name=this , desc=Lcom/co/m2m/alarmgather/CommMessageGather;, sig=null, start=L1, end=L2>
     <localVar:index=1 , name=message , desc=Ljava/lang/String;, sig=null, start=L1, end=L2>
     <localVar:index=2 , name=direct , desc=Ljava/lang/String;, sig=null, start=L1, end=L2>
     <localVar:index=3 , name=messageType , desc=Ljava/lang/String;, sig=null, start=L1, end=L2>

     L1 {
         aload0 // reference to self
         aload1 // reference to arg0
         aload2 // reference to arg1
         aload3
         aconst_null
         invokevirtual com/co/m2m/alarmgather/CommMessageGather sendCommMessage((Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V);
     }
     L3 {
         return
     }
     L2 {
     }
 }

 public sendCommMessage(java.lang.String arg0, java.lang.String arg1, java.lang.String arg2, java.lang.String arg3) { //(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V
     <localVar:index=0 , name=this , desc=Lcom/co/m2m/alarmgather/CommMessageGather;, sig=null, start=L1, end=L2>
     <localVar:index=1 , name=message , desc=Ljava/lang/String;, sig=null, start=L1, end=L2>
     <localVar:index=2 , name=direct , desc=Ljava/lang/String;, sig=null, start=L1, end=L2>
     <localVar:index=3 , name=messageType , desc=Ljava/lang/String;, sig=null, start=L1, end=L2>
     <localVar:index=4 , name=sid , desc=Ljava/lang/String;, sig=null, start=L1, end=L2>
     <localVar:index=5 , name=interCommMessageBean , desc=Lcom/co/m2m/base/bean/InterCommMessageBean;, sig=null, start=L3, end=L2>

     L1 {
         aload0 // reference to self
         aload1 // reference to arg0
         aload2 // reference to arg1
         aload3 // reference to arg2
         aload4
         invokespecial com/co/m2m/alarmgather/CommMessageGather createCommBean((Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)Lcom/co/m2m/base/bean/InterCommMessageBean;);
         astore5
     }
     L3 {
         aconst_null
         aload0 // reference to self
         getfield com/co/m2m/alarmgather/CommMessageGather.sendInterCommLogProducer:com.co.m2m.base.jms.producor.NotifyMessageProducer
         if_acmpeq L4
     }
     L5 {
         getstatic com/co/m2m/alarmgather/CommMessageGather.scheduledThreadPoolExecutor:java.util.concurrent.ScheduledThreadPoolExecutor
         new com/co/m2m/alarmgather/CommMessageGather$1
         dup
         aload0 // reference to self
         aload5
         invokespecial com/co/m2m/alarmgather/CommMessageGather$1 <init>((Lcom/co/m2m/alarmgather/CommMessageGather;Lcom/co/m2m/base/bean/InterCommMessageBean;)V);
         invokevirtual java/util/concurrent/ScheduledThreadPoolExecutor execute((Ljava/lang/Runnable;)V);
     }
     L4 {
         return
     }
     L2 {
     }
 }

 private createCommBean(java.lang.String arg0, java.lang.String arg1, java.lang.String arg2, java.lang.String arg3) { //(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)Lcom/co/m2m/base/bean/InterCommMessageBean;
     <localVar:index=0 , name=this , desc=Lcom/co/m2m/alarmgather/CommMessageGather;, sig=null, start=L1, end=L2>
     <localVar:index=1 , name=message , desc=Ljava/lang/String;, sig=null, start=L1, end=L2>
     <localVar:index=2 , name=direct , desc=Ljava/lang/String;, sig=null, start=L1, end=L2>
     <localVar:index=3 , name=messageType , desc=Ljava/lang/String;, sig=null, start=L1, end=L2>
     <localVar:index=4 , name=sid , desc=Ljava/lang/String;, sig=null, start=L1, end=L2>
     <localVar:index=5 , name=interCommMessageBean , desc=Lcom/co/m2m/base/bean/InterCommMessageBean;, sig=null, start=L3, end=L2>

     L1 {
         new com/co/m2m/base/bean/InterCommMessageBean
         dup
         invokespecial com/co/m2m/base/bean/InterCommMessageBean <init>(()V);
         astore5
     }
     L3 {
         aload4
         invokestatic org/apache/commons/lang3/StringUtils isNotEmpty((Ljava/lang/CharSequence;)Z);
         ifeq L4
     }
     L5 {
         aload5
         aload4
         invokevirtual com/co/m2m/base/bean/InterCommMessageBean setSid((Ljava/lang/String;)V);
     }
     L4 {
         aload5
         new java/util/Date
         dup
         invokespecial java/util/Date <init>(()V);
         invokevirtual com/co/m2m/base/bean/InterCommMessageBean setCommTime((Ljava/util/Date;)V);
     }
     L6 {
         aload5
         aload1 // reference to arg0
         invokevirtual com/co/m2m/base/bean/InterCommMessageBean setMessage((Ljava/lang/String;)V);
     }
     L7 {
         aload5
         aload2 // reference to arg1
         invokevirtual com/co/m2m/base/bean/InterCommMessageBean setDirection((Ljava/lang/String;)V);
     }
     L8 {
         aload5
         aload3 // reference to arg2
         invokevirtual com/co/m2m/base/bean/InterCommMessageBean setMessageType((Ljava/lang/String;)V);
     }
     L9 {
         aload5
         areturn
     }
     L2 {
     }
 }

 static access$000(com.co.m2m.alarmgather.CommMessageGather arg0) { //(Lcom/co/m2m/alarmgather/CommMessageGather;)Lcom/co/m2m/base/jms/producor/NotifyMessageProducer;
     <localVar:index=0 , name=x0 , desc=Lcom/co/m2m/alarmgather/CommMessageGather;, sig=null, start=L1, end=L2>

     L1 {
         aload0
         getfield com/co/m2m/alarmgather/CommMessageGather.sendInterCommLogProducer:com.co.m2m.base.jms.producor.NotifyMessageProducer
         areturn
     }
     L2 {
     }
 }

 static  { // <clinit> //()V
     L1 {
         new java/util/concurrent/ScheduledThreadPoolExecutor
         dup
         bipush 30
         invokespecial java/util/concurrent/ScheduledThreadPoolExecutor <init>((I)V);
         putstatic com/co/m2m/alarmgather/CommMessageGather.scheduledThreadPoolExecutor:java.util.concurrent.ScheduledThreadPoolExecutor
         return
     }
 }

//the following inner classes couldn't be decompiled: com/co/m2m/alarmgather/CommMessageGather$1 }

actuallly,I have another class named CommMessageGather$1.class in the samei directory.

maaatts commented 9 years ago

Can you put CommMessageGather$1 here as well?

yuxh commented 9 years ago

CommMessageGather$1 's bytecode: class com/co/m2m/alarmgather/CommMessageGather$1 implements java/lang/Runnable {

 synthetic final com.co.m2m.base.bean.InterCommMessageBean val$interCommMessageBean;
 synthetic final com.co.m2m.alarmgather.CommMessageGather this$0;

 CommMessageGather$1(com.co.m2m.alarmgather.CommMessageGather arg0, com.co.m2m.base.bean.InterCommMessageBean arg1) { //(Lcom/co/m2m/alarmgather/CommMessageGather;Lcom/co/m2m/base/bean/InterCommMessageBean;)V
     <localVar:index=0 , name=this , desc=Lcom/co/m2m/alarmgather/CommMessageGather$1;, sig=null, start=L1, end=L2>

     L1 {
         aload0
         aload1
         putfield com/co/m2m/alarmgather/CommMessageGather$1.this$0:com.co.m2m.alarmgather.CommMessageGather
         aload0
         aload2
         putfield com/co/m2m/alarmgather/CommMessageGather$1.val$interCommMessageBean:com.co.m2m.base.bean.InterCommMessageBean
         aload0
         invokespecial java/lang/Object <init>(()V);
         return
     }
     L2 {
     }
 }

 public run() { //()V
     <localVar:index=0 , name=this , desc=Lcom/co/m2m/alarmgather/CommMessageGather$1;, sig=null, start=L1, end=L2>

     L1 {
         aload0
         getfield com/co/m2m/alarmgather/CommMessageGather$1.this$0:com.co.m2m.alarmgather.CommMessageGather
         invokestatic com/co/m2m/alarmgather/CommMessageGather access$000((Lcom/co/m2m/alarmgather/CommMessageGather;)Lcom/co/m2m/base/jms/producor/NotifyMessageProducer;);
         aload0
         getfield com/co/m2m/alarmgather/CommMessageGather$1.val$interCommMessageBean:com.co.m2m.base.bean.InterCommMessageBean
         invokevirtual com/co/m2m/base/jms/producor/NotifyMessageProducer send((Ljava/io/Serializable;)V);
     }
     L3 {
         return
     }
     L2 {
     }
 }

}