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()方法,实现动态代理。
定义目标接口:
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()方法,实现动态代理。
相关文章推荐
- 如何计算Java对象占用了多少空间?
- 【JVM系列】Java class文件解析1
- java设计模式—工厂模式
- 【spring配置】——spring aop配置
- 2. RMI的jdk的实现
- Java与模式:装饰(Decorator)模式
- 【慕课笔记】第三章 常用的运算符 第2节 JAVA中的算术运算符
- java图片下载
- 使用SpringBoot快速搭建服务器
- 使用SpringBoot快速搭建服务器
- JavaMail学习四 JavaMailAPI
- Eclipse常用设置
- [java] Unsupported major.minor version 51.0 错误解决方案
- Java jdk 环境变量设置
- JVM学习——编译OpenJDK
- Java不可变对象
- Java异常
- 【spring配置】——spring配置数据源
- 从头认识java-17.2 线程中断(interrupt)
- java ssh整合出的错java.lang.NoSuchMethodError: antlr.collections.AST.getLine()