在正式开始动态代理模式的介绍之前,先同大家一起回顾一下代理。
那么如何理解代理呢?我们在程序中为了提供额外的或不同的操作,插入的用来代替实际对象的对象,通常充当着中间人的角色。
简单代理示例代码:
package com.tu.test.proxy;
public interface Interface {
void doSomething();
void somethingElse(String arg);
}
package com.tu.test.proxy;
public class RealObject implements Interface {
@Override
public void doSomething() {
System.out.println("doSomething....");
}
@Override
public void somethingElse(String arg) {
System.out.println("somethingElse..." + arg);
}
}
package com.tu.test.proxy;
public class SimpleProxy implements Interface {
private Interface proxied;
public SimpleProxy(Interface proxied) {
this.proxied = proxied;
}
@Override
public void doSomething() {
System.out.println("SimpleProxy doSomething...");
proxied.doSomething();
}
@Override
public void somethingElse(String arg) {
System.out.println("SimpleProxy somethingElse..." + arg);
proxied.somethingElse(arg);
}
}
package com.tu.test.proxy;
public class SimpleProxyDemo {
public static void consumer(Interface iface){
iface.doSomething();
iface.somethingElse("proxy");
}
public static void main(String[] args) {
consumer(new RealObject());
consumer(new SimpleProxy(new RealObject()));
}
}
认识了简单代理,现在开始认识动态代理!
动态代理就是动态地创建代理并动态地处理对所代理方法的调用。
使用了动态代理,所有调用都会被重定向到一个单一的调用处理器(一个实现InvocationHandler接口的类)上。
说太多没多大意思,结合具体示例代码来理解。
package com.tu.test.proxy;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
public class DynamicProxyHandler implements InvocationHandler {
private Object proxied;//要被代理的对象
public DynamicProxyHandler(Object proxied) {
this.proxied = proxied;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
System.out.println("proxy:" + proxy.getClass() + ",method:" + method + ",args:" + args);
if (args != null) {
for (Object arg : args) {
System.out.println(" " + arg);
}
}
//执行method.invoke方法之前可以进行方法的过滤,判断method.getName()
return method.invoke(proxied, args);
}
}
package com.tu.test.proxy;
import java.lang.reflect.Proxy;
public class SimpleDynamicProxy {
public static void consumer(Interface iface){
iface.doSomething();
iface.somethingElse("proxy");
}
public static void main(String[] args) {
RealObject real = new RealObject();
consumer(real);
//insert a proxy and call method again
/**
* 创建一个动态代理:Proxy.newProxyInstance(参数1:通过一个已经加载的对象获取类加载器,参数2:该代理实现的接口列表,参数3:单一的调用处理器InvocationHandler)
* **/
consumer((Interface)Proxy.newProxyInstance(Interface.class.getClassLoader(), new Class[]{Interface.class}, new DynamicProxyHandler(real)));;
}
}
相关推荐
动态代理模式 适配器模式 实现,都可以运行,有一部分注解
java中的装饰模式及动态代理模式示例源码,并且手写数据库连接池,以及展示动态代理模式在连接池中的使用
AOP的意思就是面向切面编程。本文主要是通过梳理JDK中自带的反射机制,实现 AOP动态代理模式,这也是Spring AOP 的实现原理
自己编写的设计模式示例,绝对不含伪代码,示例简单易懂 适合初学者学习使用
动态代理设计模式 日志和源码 动态代理设计模式 日志和源码
java 代理模式实现代码及设计详解:动态代理模式、静态代理模式
动态代理模式实现界面跳转传值,里面包含了静态代理的使用
引入了动态代理模式和mysql数据库的处理,对core java内容进行了一次深入的实践,实现了功能有开户、销户、存款、取款、转账等等
JAVA动态代理模式-.pdf
JAVA动态代理模式.pdf
简单动态代理模式的实现,自己更改一下包名就可用了
Spring整合JDBC实现转账业务-动态代理模式demo源代码,在这里我们我们对其Spring整合JDBC实现转账业务进行优化更新,使其业务层完全脱离我们的事务书写,我们采用的时候动态代理模式
NULL 博文链接:https://arne3166.iteye.com/blog/1046340
c#动态代理核心代码,通过.netframe work 提供的realproxy类实现动态代理模式。
自己总结的代理模式和Java中的动态代理模式,有源码
主要介绍了Java动态代理模式简单案例代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
代理模式(Proxy) 定义: 为其他对象提供一种代理以控制对这个对象的访问 结构: 由三部分组成 1.RealSubject(真实对象): 真正会调用到的对象 2.Proxy(代理对象): 代理真实对象的地方 3.Subject(共同点): 代理对象...
基于java的jdk动态代理, 比较了静态代理与动态代理的区别,以及动态代理的底层实现,反编译class文件 jdk动态代理和cglib的区别