应用场景:不改变被代理对象的代码,新建动态代理类,并在代理类中增加相应的处理代码。
在目前的Java开发包中包含了对动态代理的支持,但是其实现只支持对接口的的实现。
其实现主要通过是java.lang.reflect.Proxy类和java.lang.reflect.InvocationHandler接口。
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
//动态代理设计模式: InvocationHandler
//doBefore(): 在代理调用被代理方法前执行
//doAfter(): 在代理类调用被代理方法后执行
public class Dyn {
/** 获取代理对象 */
public static IHelloWorld getHelloWoldProxy() {
IHelloWorld hello = new HelloWorld();
InvocationHandler handler = new DynHandler(hello);
ClassLoader cl = hello.getClass().getClassLoader();
IHelloWorld helloProxy = (IHelloWorld)Proxy.newProxyInstance(cl, new Class[]{IHelloWorld.class}, handler);
return helloProxy;
}
public static void main(String[] args) {
IHelloWorld proxy = getHelloWoldProxy();
//调用hi()之前,调用doBefore(),hi()运行之后,调用doAfter()
String c = proxy.hi("dog");
System.out.println(c);
}
}
class DynHandler implements InvocationHandler{
//被代理者
private Class cls = null;
//被代理的实例
private IHelloWorld obj = null;
//我要代理谁
public DynHandler(IHelloWorld obj){
this.obj = obj;
}
//调用被代理的方法
/**
* args: proxy.hi传进来的参数
*/
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println("invoke() ..");
doBefore(args);
Object result = method.invoke(this.obj, args);
doAfter(args);
return result; //返回代理对象
}
public void doBefore(Object[] args){
System.out.println("doBefore() .." + (String)args[0]);
}
public void doAfter(Object[] args){
System.out.println("doAfter() ..");
}
}
//被代理类
class HelloWorld implements IHelloWorld{
public String hi(String name) {
System.out.println("hi() ..");
return "hello " + name;
}
}
//Exception in thread "main" java.lang.IllegalArgumentException: cn.util.HelloWorld is not an interface
interface IHelloWorld{
public String hi(String name);
}
//2.代理模式
public class DynamicPattern {
private Hello h;
public DynamicPattern(Hello h){
this.h=h;
}
public String sayHi(String name){
String str = h.hi(name);
System.out.println("sayHi() ..");
return str;
}
public static void main(String args[]){
DynamicPattern d = new DynamicPattern(new Hello());
String s = d.sayHi("jake");
System.out.println(s);
}
}
class Hello{
public String hi(String name) {
System.out.println("hi() ..");
return "hello " + name;
}
}
相关推荐
Java设计模式——代理设计模式(静态代理和动态代理) 各种情况例子源码
详细而又简单的讲述了java动态代理设计模式
Java 经典设计模式讲解以及项目实战 设计模式简介:主要介绍各种设计模式的概念和运用场景等 设计模式综合运用:主要是笔者在实际工作中运用到的一些设计模式综合运用事例的提炼 Spring设计模式简介:主要是讲述...
Java设计模式之代理模式(结构)Java设计模式之代理模式(结构)Java设计模式之代理模式(结构)Java设计模式之代理模式(结构)Java设计模式之代理模式(结构)
JAVA设计模式之代理模式实例
java常用设计模式及JDK与CGLIB实现动态代理区别(源码) /** * 使用cglib动态代理 * @author * */ public class BookFacadeProxy implements MethodInterceptor{ private Object target; @Override public...
NULL 博文链接:https://871656094.iteye.com/blog/2355335
使用5种设计模式完成的一个点单系统,显示不同系列下的所有商品,点击选择冰度甜度之后添加到订单中,计算总金额,下单之后发送订单到门店的后厨制作商品。使用了抽象工厂模式、装饰模式、单例模式、代理模式、原型...
Java 设计模式 代理模式介绍,含源码
总体来说设计模式分为三大类: 创建型模式,共五种:工厂方法模式、抽象工厂模式、单例模式、建造者模式、原型模式。 结构型模式,共七种:适配器模式、装饰器模式、代理模式、外观模式、桥接模式、组合模式、享元...
用myeclipse开发的java设计模式课程设计,课题内容为西瓜工厂,包含四个设计模式,单例模式、代理模式、建造者模式和抽象工厂模式,有较好的图形界面,文档内附有完整代码,适用于新手学习。
设计模式主要分为三大类: 1.创建型模式:工厂模式、抽象工厂模式、单例模式、建造者模式、原型模式。 2.结构型模式:适配器模式、桥接模式、装饰模式、组合模式、外观模式、享元模式、代理模式。 4.行为型模式:...
Java动态代理设计模式中融入抗疫元素的课程思政教学
java设计模式(工厂模式,动态代理,责任链模式……)实例源码
java设计模式视频教程-代理模式, 深层了解java的设计模式
java 代理模式实现代码及设计详解:动态代理模式、静态代理模式
设计模式之Proxy(代理) 设计模式之Adapter(适配器) 设计模式之Composite(组合) 设计模式之Decorator(油漆工) 设计模式之Bridge 设计模式之Flyweight(享元) 行为模式: 设计模式之Template 设计模式之Memento(备忘机制...
Java代码积累:并发 设计模式 数据结构 使用容器 实用 类 基础知识 并发性 演示线程的生命周期 生产者-消费者 设计模式参考《大话设计模式》 工厂简单模式 创造型模式 工厂方法模式 抽象工厂模式 原型模式 建造者...
java设计模式【之】JDK动态代理【源码】【场景:帮爸爸买菜】.rar /** * 代理模式 * 在开发者的角度来看,创建一个代理对象,提供给用户使用,避免用户直接访问真正的对象 * 在用户角度来看,就是普通的类方法...
java模式设计-代理模式之动态代理.ppt