在反编译的aspecj代码中看到的这个数字是多少?

时间:2015-06-06 04:57:53

标签: aspectj

我编译并编织了java和aj文件。 然后我将类文件反编译为每个java和aj文件。

从恢复的文件中,我可以看到相同的号码'$ 1 $ 8e6adf60'。

反编译java

CarAspect.aspectOf().ajc$before$car_CarAspect$1$8e6adf60();

反编译aj

public void ajc$before$car_CarAspect$1$8e6adf60()
{
    System.out.println("The car color has changed!");
}

你能告诉我这个号码的含义吗?

我可以用这个号码来澄清独特的编织吗?

提前感谢您的建议。

吴。

1 个答案:

答案 0 :(得分:1)

第一个美元后的数字是方面内的建议编号。第二个美元之后的数字是与建议相关的切入点文本的哈希码。例如:

public aspect Code {
  before(): execution(* *(..)) {}
  before(): execution(* *(..)) {}
  before(): execution(* m(..)) {}
}

javap Code.class

public void ajc$before$Code$1$3444dde4();
public void ajc$before$Code$2$3444dde4();
public void ajc$before$Code$3$a6998f81();

建议编号1,2和3.请注意前两个建议成员的哈希码元素是相同的,因为切入点是相同的。

  

我可以用这个号码来澄清独特的编织吗?

不太清楚你的意思,但希望你可以根据我的描述弄清楚

数字的历史......

我们(AspectJ)实际上使用这些数字来进行渐进式编译。最初我们使用原始方面源文件中的建议的“源代码行”作为名称后缀。那非常脆弱。如果您只是在文件的开头添加了一个空行,则所有生成的方面成员都将更改名称,因为此数字已更改(行号增加)。如果发生这种情况,那么我们不得不重新编织整个系统,因为所有对这些人的调用都必须更新。我们需要更强大的东西。所以我们想出了这个。使用第一个数字意味着在具有相同切入点文本的建议之前没有具有冲突的名称。结合第二个数字,我们有一个名称,如果您更改源方面的空白区域,该名称将不会更改。唯一真正改变它的是你改变切入点 - 当然,如果你改变了切入点,那么我们需要重新编织所有东西,因为它现在可能比以前更多/更少。