您的位置:首页 > 编程语言 > Java开发

JDK动态代理原理及实现

2016-01-10 17:06 609 查看
代理是基本的设计模式之一,它为你提供额外的或者不同的操作。JAVA动态代理比代理的思想更迈进了一步,在动态代理上所做的所有调用都会被重定向到单一的调用处理器上,它的工作是揭示调用的类型并且确定相应的对策,动态代理中,接口中声明的所有方法都被转移到一个集中的地方处理,也就是invoke()中。

定义目标接口:

public interface UserManager {

public void addUser(String name,String password);

public void findUser(String id);

}

目标接口的实现类:

public class UserManagerImpl implements UserManager{

public void addUser(String name, String password) {

System.out.println("name:"+name+" password:"+password);

}

public void findUser(String id) {

System.out.println("id:"+id);

}

}

动态代理对象类,实现InvocationHandler 接口:

public class DynamicProxy implements InvocationHandler {

// 目标对象

private UserManager userManager;

// 通过构造方法传入目标对象

public DynamicProxy(UserManager userManager) {

this.userManager = userManager;

}

//根据传入的目标返回一个代理对象

public Object newProxy(){

//第一个参数指定产生代理对象的类加载器,需要将其指定为和目标对象同一个类加载器

//第二个参数要实现和目标对象一样的接口,所以只需要拿到目标对象的实现接口

//第三个参数表明这些被拦截的方法在被拦截时需要执行哪个InvocationHandler的invoke方法

return Proxy.newProxyInstance(userManager.getClass().getClassLoader(),

userManager.getClass().getInterfaces(), this);

}

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

throws Throwable {

Object result = null;

try {

//反射调用目标对象的方法

result = method.invoke(userManager, args);

check();

} catch (Exception e) {

e.printStackTrace();

}

return result;

}

public void check(){

System.out.println("通过代理执行该方法");

}

}

实现类:

public class Invocation {

public static void main(String[] args) {

DynamicProxy dp = new DynamicProxy(new UserManagerImpl());

UserManager user = (UserManager)dp.newProxy();

user.addUser("song", "123456");

user.findUser("1");

}

}

首先对InvocationHandler 类传入目标对象接口,只能对接口进行处理,通过目标接口返回动态代理的目标对象,此时是一个代理对象,当调用该代理对象的方法时,执行inovke()方法,实现动态代理。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: