jd-gui生成的合成accessor代码如何理解?
How to understand the synthetic accessor code generated by 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[=10=]2(new Date());
...
}
....
agrPullingAgentStudy.access2(agrPullingAgentStudy.m_szExecHosp.substring(0, agrPullingAgentStudy.m_szExecHosp.length() - 1));
...
}
}
class agrPullingAgentStudy
包含一个名为 dcmStudySchedule 的内部 class。并在内部 class。
我无法理解的是我已经知道的 access$xxx
,因为如果内部 class 试图访问外部 class 成员,那么生成的代码将用户 access$xxx
来表示这种代码。我只想知道是否有解决此问题的解决方法。或者我如何理解这段代码?谢谢。
以下代码段将生成您的反编译源。
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[=15=]2(new Date())
在字节码级别进行一些调查会很有帮助。
首先编译源码javac agrPullingAgentStudy .java
。它生成两个 *.class
文件。 agrPullingAgentStudy.class
和 agrPullingAgentStudy$dcmStudySchedule.class
。 (好的,到现在为止没有惊喜)。
为了从 class dcmStudySchedule
访问变量 m_dAliveDT
,编译器在 agrPullingAgentStudy
中生成了一个合成方法。签名是static Date access[=23=]2(Date var0)
.
怎么得出这个结论的? ... 简单:使用 javap
.
javap -c -v agrPullingAgentStudy.class
显示生成的字节码
static java.util.Date access[=12=]2(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[=14=]2(Date d) {
m_dAliveDT = d; // putstatic #1
return d; // areturn
}
全部,我试图阅读一些从 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[=10=]2(new Date());
...
}
....
agrPullingAgentStudy.access2(agrPullingAgentStudy.m_szExecHosp.substring(0, agrPullingAgentStudy.m_szExecHosp.length() - 1));
...
}
}
class agrPullingAgentStudy
包含一个名为 dcmStudySchedule 的内部 class。并在内部 class。
我无法理解的是我已经知道的 access$xxx
,因为如果内部 class 试图访问外部 class 成员,那么生成的代码将用户 access$xxx
来表示这种代码。我只想知道是否有解决此问题的解决方法。或者我如何理解这段代码?谢谢。
以下代码段将生成您的反编译源。
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[=15=]2(new Date())
在字节码级别进行一些调查会很有帮助。
首先编译源码javac agrPullingAgentStudy .java
。它生成两个 *.class
文件。 agrPullingAgentStudy.class
和 agrPullingAgentStudy$dcmStudySchedule.class
。 (好的,到现在为止没有惊喜)。
为了从 class dcmStudySchedule
访问变量 m_dAliveDT
,编译器在 agrPullingAgentStudy
中生成了一个合成方法。签名是static Date access[=23=]2(Date var0)
.
怎么得出这个结论的? ... 简单:使用 javap
.
javap -c -v agrPullingAgentStudy.class
显示生成的字节码
static java.util.Date access[=12=]2(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[=14=]2(Date d) {
m_dAliveDT = d; // putstatic #1
return d; // areturn
}