java 动态代理实现aop

尝试使用动态代理,感谢:

http://sweets.cf/2015/12/08/%E4%BD%BF%E7%94%A8Java%E5%8E%9F%E7%94%9F%E4%BB%A3%E7%90%86%E5%AE%9E%E7%8E%B0AOP/

 

一、spring aop

spring aop基础

通过spring实现aop,实现比较简单,没有涉及原理。

二、实现动态代理

1.被代理的对象

被代理的对象可以是接口,也可以是类。首先声明一个接口God。

god.java

既然有接口,当然需要有一个实现类:

xie.java

2.写一个代理处理类

现在需要写一个代理处理类,来决定代理的过程中要做些什么。是要进行一下参数的校验?还是改变执行的过程?或者是进行一下日志的校验?这些操作都在代理类中进行。

aophandler.java

(1)实现InvocationHandler接口

代理处理类需要实现InvocationHandler接口,然后在invoke方法中进行具体代理操作。

(2)通过反射来执行实现类中的方法,从而返回结果。

之后返回执行结果,实现了代理执行效果:

3.获取代理对象

代理对象是通过这个方法获取的:

newProxyInstance方法的说明为:

Returns an instance of a proxy class for the specified interfaces that dispatches method invocations to the specified invocation handler.

需要的参数:

loader the class loader to define the proxy class

interfaces the list of interfaces for the proxy class to implement

h the invocation handler to dispatch method invocations to

返回的结果:

a proxy instance with the specified invocation handler of a proxy class that is defined by the specified class loader and that implements the specified interfaces

现在我们需要三个参数:loader、interfaces和h。

loader是类加载器,通过object.getClass().getClassLoader()方法获取loader(这里的object是实现类的对象)。

interfaces是实现类所实现的接口,通过object.getClass().getInterfaces()获取interfaces。

h是代理处理类的对象,通过new aophandler(object)获取对象。

为了方便获取代理对象,写一个工厂类:

factory.java

通过重载getGod方法,无论是传入的参数是实现类的类名、实现类,还是实现类的对象,都可以实现类的对象,之后可以通过getGodBase方法获取代理类的对象。

4.运行

main.java

获取一个代理对象god:

所有的方法实际上都是代理对象在执行,从而实现了动态代理。

这里的输出结果很多时候是无序的(一些syso在invoke的时候就应该输出到控制台了),这是因为输出流缓存的问题(解决方法是在每条输出语句后调用flush方法)。

运行结果为:

三、实现aop

动态代理是首先aop的基础。

在上面的动态代理中,所有方法都是固定的。aop可以控制方法本身和方法执行的时机。

1.实现接口

aop允许我们执行自定义方法,首先实现aop方法的接口。

aopmethod.java

2.修改代理处理类

通过把自定义方法写在处理类执行的方法前后决定执行时机。

aophandler.java

3.传入自定义的方法

把aop接口作为参数传入代理处理类对象中。

factory.java

4.实际定义aop方法,并且通过构造器传入代理类

可以自定义aop的方法。

main.java

运行结果为:

以上的代码,只能实现相当简易的aop功能,可以继续在此基础上不断拓展。

四、总结

下次拓展一下,尝试配合注解反射实现具体功能。

发表评论

电子邮件地址不会被公开。 必填项已用*标注