欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

动态代理设计模式 Java

程序员文章站 2022-05-29 13:25:49
...

 

应用场景:不改变被代理对象的代码,新建动态代理类,并在代理类中增加相应的处理代码。

 

在目前的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;
 }
}

相关标签: 设计模式