如何理解jd-gui生成的合成访问器代码?

时间:2016-04-28 08:22:45

标签: java decompiler jd-gui

所有,我试图阅读一些从jd-gui生成的代码。它看起来像下面。

    public class agrPullingAgentStudy
    {
      private static final String PGPR_ID = "agrPullingAgentStudy";
      private static Timer m_tmStudy = null;
      private static Timer m_tmNonStop = null;
      private static Timer m_tmRemove = null;
      private static String m_szManual = "";
      private static String m_szProcRule = "";
      private static String m_szExecHosp = "";
      private static HashMap<String, HashMap> m_hRemoteAll = new HashMap();
      private static HashMap<String, String> m_hProcRule = null;
      private static int m_nImageAfterMins = -120;
      private static boolean m_bDoProcess = false;
      private static Date m_dAliveDT = new Date();
      private static final String LINE_SEP = System.getProperty("line.separator");
    ....



      private class dcmStudySchedule
        extends TimerTask
      {

        public void run()
        {
          String FUN_ID = "runStudySchedule";
          StringBuffer szBuffer = new StringBuffer();
          agrPullingAgentStudy.access$002(new Date());

          ...
        }


       ....
       agrPullingAgentStudy.access$402(agrPullingAgentStudy.m_szExecHosp.substring(0, agrPullingAgentStudy.m_szExecHosp.length() - 1));
       ...
      }
    }

agrPullingAgentStudy包含一个名为dcmStudySchedule的内部类。而在内心阶层。

我无法理解的是我已经知道的access$xxx因为如果内部类试图访问外部类成员,那么生成的代码将用户access$xxx来表示这种代码。我只想知道是否有任何解决方法来解决此问题。或者我如何理解这段代码?谢谢。

1 个答案:

答案 0 :(得分:1)

以下代码段将生成您的反编译源。

import java.util.Date;
import java.util.TimerTask;

public class agrPullingAgentStudy {

    private static Date m_dAliveDT = new Date();

    private class dcmStudySchedule extends TimerTask {

        public void run() {
            m_dAliveDT = new Date();
        }
    }
}

了解agrPullingAgentStudy.access$002(new Date())对字节码级别进行一些调查很有帮助。

首先编译源javac agrPullingAgentStudy .java。它会生成两个*.class个文件。 agrPullingAgentStudy.classagrPullingAgentStudy$dcmStudySchedule.class。 (好吧直到现在没有价格。)

要从类m_dAliveDT访问变量dcmStudySchedule,编译器会在agrPullingAgentStudy中生成合成方法。签名为static Date access$002(Date var0)

如何得出这个结论? ......简单:使用javap

javap -c -v agrPullingAgentStudy.class

显示生成的字节码

static java.util.Date access$002(java.util.Date);
  descriptor: (Ljava/util/Date;)Ljava/util/Date;
  flags: ACC_STATIC, ACC_SYNTHETIC
  Code:
    stack=2, locals=1, args_size=1
       0: aload_0
       1: dup
       2: putstatic     #1        // Field m_dAliveDT:Ljava/util/Date;
       5: areturn

#1引用常量池中的索引(也将通过上面的javap命令显示)

Constant pool:
   #1 = Fieldref       #5.#21   // agrPullingAgentStudy.m_dAliveDT:Ljava/util/Date;
...

作为Java源代码,它看起来像

static Date access$002(Date d) {
    m_dAliveDT = d;               // putstatic #1
    return d;                     // areturn
}