2016-04-28 3 views
0

すべて私は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

次のスニペットは、逆コンパイルされたソースを生成します。それはバイトコードレベルでいくつかの調査を行うには便利ですagrPullingAgentStudy.access$002(new Date())を理解することが

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(); 
     } 
    } 
} 

最初にソースjavac agrPullingAgentStudy .javaをコンパイルします。 2つの*.classファイルを生成します。 agrPullingAgentStudy.classおよびagrPullingAgentStudy$dcmStudySchedule.class。 (これまでのところ確認できません)。

dcmStudyScheduleの変数m_dAliveDTにアクセスするには、コンパイラは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コマンドによって示される)は、Javaソースとして

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

定数プール内のインデックスを参照すること見えるでしょう

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

こんにちは、最適な説明をありがとう。あなたの例について#1はバイトコードで何を意味しますか?それは、それがそこに多くのメンバーがいる場合、どのような外部クラスの最初のメンバーを表すようですか? #番号が表すメンバーを知るには?ありがとう。 –

+0

@ Joe.wang '#1'が定数プールのインデックスを参照しています。 'javap'の出力をよりよく理解するためには、[Javaファイルのフォーマット](http://(Java)の[Java Virutal Machine Sepecification](http://docs.oracle.com/javase/specs/) docs.oracle.com/javase/specs/jvms/se8/html/jvms-4.html)。 – SubOptimal

+0

参考までに、Procyonの逆コンパイラは合成アクセッサをインライン化する必要があり、逆アセンブラはjavapが示す単純な定数プールインデックスよりも有用なメンバ参照を表示します。 CFRは合成アクセサでもうまくやっています。 –

関連する問題