aspectj中call和execute在spring架构中的重要区别

在使用aspectj进行定义pointcut时,经常碰到的问题就是该使用call还是execute。当然,在spring中,只支持execute,而不支持call,但使用aspectj如ltw时就可以使用,但两者究竟有什么区别,最大的区别在哪儿,适用点又在哪儿。这就要从定义出来,来了解相关信息了。

在文档《aspectj_in_action_second_editon.pdf》中,针对二者,主要如下面所述:

a call is on the caller side, whereas execution happens on the receiver side—they’re two completely different places. 

即call工作在调用端,而execute工作在被调用端。
如我们将在pointcut打印一句helloworld。那么针对helloAction调用helloService而言。针对call调用,这句打印将会在helloAction中调用,而execute调用,而是在helloService中调用。

以上只是表面上的区别,在具体使用时其实并不是太大的差别,但如果有以下一句话,那么区别就可能完全不一样了:

aspectj是通过修改字节码来完成相应的功能,通过在相应的pointcut定义指定的advice来完成功能。

具体点说,就是aspectj首先需要能够匹配到相应的pointcut,然后才能执行相应的advice方法,如果不能匹配到pointcut,那么就不能执行相应的方法。

继续阅读“aspectj中call和execute在spring架构中的重要区别”

使用javassist进行java类的实现方法修改

     前段时间在做一个关心软件授权方面的研究,即给一个软件进行授权管理,其中就涉及到如何创建license,并利用license来保护我们的软件。
    这其中最主要的问题,即是如何保护真正的授权部分代码了。即将真正进行授权访问的代码给保护起来,并不让软件使用人通过某种方法来进行软件的破解或者盗用。一般来说,破解软件最简单的方法即是修改授权部分代码的实现,让授权部分验证始终返回true。如果想办法不让使用者查看最终的授权部分代码,那么则只能通过其它方法来进行破解了。
    那么,我们可以通过一种手段来在程序内部来修改授权部分的实现,使真实的授权部分隐藏在其它代码部分,而可视的授权代码并不参与实际的授权授权,这样的话,对于破解者来说,修改表向的代码实现并不能真正修改代码实现,因为真实的实现已经通过其它代码将原始实现替换掉了。
    以下是一种修改的示意图:
       
    即在调用授权代码之前将授权原代码进行修改,然后调用授权代码时即调用已经修改后的授权代码,而真实的授权代码是查看不了的(通过某种方式注入),这样即达到一种授权方式的隐藏。

继续阅读“使用javassist进行java类的实现方法修改”