代理模式是常用的Java设计模式,他的特征是代理类与委托类有同样的接口,代理类主要负责为委托类

预处理消息,过滤消息,把消息转发给委托类,以及事后处理消息等。

  代理类与委托类之间通常会存在关联关系,一个代理类的对象与一个委托类的对象关联,代理类的对象本身

并不真正实现服务,而是通过调用委托类的对象的相关方法,来提供特定服务。

动态代理类的字节码在程序运行时由Java反射机制动态生成,无需程序员手工编写它的源代码。

Java反射机制可以生成任意类型的动态代理类。java.lang.reflect包中的Proxy类和invocationHandler接口提供了

生成动态代理类的能力。

InvocationHandler接口:

public interface InvocationHandler{

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

  //  返回值null      1.指被代理的对象2.要调用的方法3.方法调用时所需要的参数

}

Proxy类:

是专门完成代理的操作类,可以通过此类为一个或多个接口动态地生成实现类,此类提供了(静态方法)如下的操作方法:

public sattic Object newProxyInstance(ClassLoader  loader,Class<?>[]  interfaces,  InvocationHandler  h)throws IllegalArgumentException

参数说明:ClassLoader  loader:类加载器

     Class<?>[]  interfaces: 得到全部的接口

     InvocationHandler  h:得到InvocationHandler接口的子类实例

类对象.getClass.getClassLoader();---获得类加载器


举例:一个吃饭的例子,我们只管吃饭,把饭前洗手,饭后刷碗的重复事情交给代理类来完成

Dinner.java-----接口

 package Jun.Proxy;

 public interface Dinner {
public String haveDinner();
}

MyDinner.java------自己的实现类-------委托类

 package Jun.Proxy;

 public class MyDinner implements Dinner{

     @Override
public String haveDinner() {
System.out.println("妈妈做的饭真好吃。。。。。");
return "真得好吃====";
} }

MyDinnerProxy.java--------代理类

功能就是,给它一个委托类对象,会返回一个代理类对象,使用的是Proxy类的方法

Proxy.newProxyInstance----得到代理类对象(实例)

 package Jun.Proxy;

 import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy; public class MyDinnerProxy implements InvocationHandler{ private Object originalObject;//被代理的原始对象 //绑定原始对象,返回一个代理对象
public Object bind(Object obj) {
this.originalObject=obj;
//里面的参数1:类加载器2:得到全部的接口3:得到InvocationHandler接口的实例---当前对象本身实现的这个接口
return Proxy.newProxyInstance(obj.getClass().getClassLoader(), obj.getClass().getInterfaces(), this);
} //吃饭之前要执行的方法
private void preMethod() {
System.out.println("吃饭之前要洗手。。。");
}
//吃饭之后要执行的方法
private void afterMethod() {
System.out.println("吃饭之后要刷碗。。。。");
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
preMethod();
Object result=method.invoke(this.originalObject, args);
afterMethod();
//invoke方法返回一个对象
System.out.println("hahahahahhaha----"+result);
return result;
}
}

MyDinnerProxyDemo.java-----测试

 package Jun.Proxy;

 public class MyDinnerProxyDemo {

     public static void main(String[] args) {
Dinner din=new MyDinner();
// din.haveDinner();
//代理类的实列
MyDinnerProxy pro=new MyDinnerProxy();
//返回了一个代理对象
din=(Dinner) pro.bind(din);
String str=din.haveDinner();
System.out.println("----------------------");
System.out.println(str);
}
}

最新文章

  1. python环境
  2. java类集开发中一对多和多对多的关系的实现
  3. UI的重用性
  4. PHPWind 8.7中插件金币竞价插件的漏洞
  5. 【Path Sum II】cpp
  6. python【第二篇】列表、元组、字典及文件操作
  7. 每个Web开发者必备的9个软技能
  8. Tomcat集群应用部署的实现机制
  9. scrapy_redis 相关: 将 jobdir 保存的爬虫进度转移到 Redis
  10. git参考, 小结
  11. HDU 5965 扫雷
  12. 深入分析HashMap
  13. 【代码笔记】iOS-NSLog的使用
  14. 图解VC++ opengl环境配置和几个入门样例
  15. jetty el表达式不支持三元运算
  16. BZOJ 1031 [JSOI2007]字符加密Cipher | 后缀数组模板题
  17. JS AJAX传递List数组到后台(对象)
  18. AtCoder Grand Contest 026 D - Histogram Coloring
  19. vue 预渲染 prerender-spa-plugin
  20. 【Python之路】第十三篇--DOM

热门文章

  1. 开始逐步补充下相关Web知识,很多年没搞了....
  2. ajax的工作原理2
  3. MXNET:丢弃法
  4. 牛客网_Go语言相关练习_选择题(2)
  5. (原创)Python文件与文件系统系列(1)—— file 对象
  6. Python_序列与映射的解包操作
  7. [UI] 06 - jQuery
  8. HRMS文件解析2
  9. Tiobe最新编程语言排行
  10. customer.java