gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 09:59:39 25 4
gpt4 key购买 nike

所有,我试图阅读一些从 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 来表示这种代码。我只是想知道是否有任何解决方法可以解决此问题。或者我怎样才能理解这段代码?谢谢。

最佳答案

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

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。 (好吧,到目前为止没有什么惊喜)。

为了从 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命令也会显示)

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
}

关于java - 如何理解jd-gui生成的合成访问器代码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36909122/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com