当前位置: 移动互联网学院 > Java培训 > JAVA开发 > 如何使用动态代理实现Java面向切面编程
如何使用动态代理实现Java面向切面编程 时间:2017-10-20     来源:华清远见Java培训中心

解耦是程序员编码开发过程中一直追求的,AOP(面向切面编程)也是为了解耦所诞生的,那么如何使用动态代理实现Java面向切面编程呢?今天Java学院小编就和大家分享下使用动态代理实现Java面向切面编程的具体方法。

如何使用动态代理实现Java面向切面编程

在一个类中每个函数都需要判断用户是否是有权限对要调用的函数进行操作的。那么,可以知道,这个判断的操作是公共的,可以把这个判断的操作提取出来。

使用Proxy的前提知识是,将要被代理的类必须是实现了一些接口的类。

我们使用下面的接口:

public interface PersonService {

public abstract void aoptest();

}

接口实现类(也就是我们要代理的类,把其中的每一个方法<这里只写一个aoptest方法>的用户权限判断使用aop的思想提取出来)如下:

import com.lqw.service.PersonService;

public class PersonServiceBean implements PersonService {

private String user=null;

public String getUser() {

return user;

}

public void setUser(String user) {

this.user = user;

}

public PersonServiceBean() {

super();

}

public PersonServiceBean(String user) {

super();

this.user = user;

}

public void aoptest() {

p("aoptest()函数被调用");

}

public void p(Object o) {

System.out.println(o);

}}

下面我们写代理类的实现:

import java.lang.reflect.InvocationHandler;

import java.lang.reflect.Method;

import java.lang.reflect.Proxy;

import com.lqw.service.impl.PersonServiceBean;

public class ProxyFactory implements InvocationHandler {

private Object tarjectObject;

public Object creatProxyInstance(Object obj) {

this.tarjectObject = obj;

return Proxy.newProxyInstance(this.tarjectObject.getClass()

.getClassLoader(), this.tarjectObject.getClass()

.getInterfaces(), this);

}

@Override

public Object invoke(Object proxy, Method method, Object[] args)

throws Throwable {

PersonServiceBean serviceBean = (PersonServiceBean) this.tarjectObject;

Object result = null;

if (serviceBean.getUser() != null) {

result = method.invoke(serviceBean, args);

}

return result;}}

代理类中invoke函数主要的功能就是进行用户判断。这里比较简单,单纯是判断是否为null,不为null,就可以去执行想要调用的函数了。

测试类如下:

import com.lqw.proxy.ProxyFactory;

import com.lqw.service.PersonService;

import com.lqw.service.impl.PersonServiceBean;

public class test {

public static void main(String[] args) {

ProxyFactory factory = new ProxyFactory();

PersonService psersonServiceBean = new PersonServiceBean();

PersonService service=(PersonService)factory.creatProxyInstance(psersonServiceBean);

service.aoptest();}}

每一次执行service调用aoptest函数的时候,代理类中的invoke函数都会被调用来判断用户是否有调用的权限,这样就做到了将用户权限判断从原来的代码中分离出来,做到了aop的面向切面编程的思想。

X