代理模式是常用的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);
}
}

动态代理Dynamic Proxy的更多相关文章

  1. Java的动态代理(dynamic proxy)

    什么是动态代理(dynamic proxy) 动态代理(以下称代理),利用Java的反射技术(Java Reflection),在运行时创建一个实现某些给定接口的新类(也称“动态代理类”)及其实例(对 ...

  2. Java动态代理一Proxy

    什么是动态代理? 动态代理可以提供对另一个对象的访问,同时隐藏实际对象的具体事实.代理一般会实现它所表示的实际对象的接口.代理可以访问实际对象,但是延迟实现实际对象的部分功能,实际对象实现系统的实际功 ...

  3. Java-马士兵设计模式学习笔记-代理模式-动态代理 调用Proxy.newProxyInstance()

    一.概述 1.目标:不自己写代理类,利用Proxy.newProxyInstance()动态生成 2.用到的知识点: (1)//编译源码,生成class,注意编译环境要换成jdk才有compiler, ...

  4. java 动态代理学习(Proxy,InvocationHandler)

    前几天看到java的动态代理机制,不知道是啥玩意,然后看了看.死活不知道 invoke(Object proxy, Method m, Object[] args)种的proxy是个什么东西,放在这里 ...

  5. java jdk动态代理(proxy)

    1. 涉及主要jdk api java.lang.reflect.InvocationHandler: public interface InvocationHandler { /** * Proce ...

  6. Java中的动态代理以及Proxy类的偷瞄

    动态代理机制 所谓动态代理,即通过代理类Proxy的代理,接口和实现类之间可以不直接发生联系,而可以在运行期(Runtime)实现动态关联. Java动态代理类位于Java.lang.reflect包 ...

  7. java动态代理、Proxy与InvocationHandler

    看了好多关于代理的文章,理解和整理一下. 1.代理的基本构成 抽象角色:声明真实对象和代理对象的共同接口,这样可在任何使用真实对象的地方都可以使用代理对象. 代理角色:代理对象内部含有真实对象的引用, ...

  8. Java的动态代理

    什么是动态代理(dynamic proxy) 动态代理(以下称代理),利用Java的反射技术(Java Reflection),在运行时创建一个实现某些给定接口的新类(也称“动态代理类”)及其实例(对 ...

  9. Cglib 与 JDK动态代理的运行性能比较

    都说 Cglib 创建的动态代理的运行性能比 JDK 动态代理能高出大概 10 倍,今日抱着怀疑精神验证了一下,发现情况有所不同,遂贴出实验结果,以供参考和讨论. 代码很简单,首先,定义一个 Test ...

随机推荐

  1. VS2013 未找到与约束ContractName Microsoft.VisualStudio.Text.ITextDocumentFactoryService

    全是2012版本的  没找到2013的! 控制面板>程序>程序和功能 找到如下选中软件右击修复 即可 需关闭VS2013 参考:https://blog.csdn.net/zhaoyun9 ...

  2. linux下安装Oracle时交换空间不足的解决方法

    摘:linux下安装Oracle时交换空间不足的解决方法 linux上安装Oracle时交换空间不足的解决办法 增加交换空间有两种方法: 严格的说,在系统安装完后只有一种方法可以增加swap,那就是本 ...

  3. 【GMT43智能液晶模块】例程四:SYSTICK定时器——定时读取触摸值

    实验原理: 本实验采用系统定时器,通过简单的初始化定时20ms,每20ms读取一次触 摸值,并基于emWin的UI界面将读到的触摸值显示在界面上. 实验现象: 源代码下载链接: 链接:http://p ...

  4. Java知多少(45)未被捕获的异常

    在你学习在程序中处理异常之前,看一看如果你不处理它们会有什么情况发生是很有好处的.下面的小程序包括一个故意导致被零除错误的表达式. class Exc0 { public static void ma ...

  5. 1分钟了解MyISAM与InnoDB的索引差异

    版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/z50L2O08e2u4afToR9A/article/details/82111747 <数据 ...

  6. Xcode 8.0 新特性 & Swift 3.0 增加的变动

    从 Xcode 8.0 开始,目前所有的插件都无法工作! NSLog 无法输出 -- 此bug等待正式版本... Xcode 提供了文档注释快捷键option + cmd + / 但是要把系统升级到1 ...

  7. Unity Remote远程调试

    http://www.cnblogs.com/qinghuaideren/p/3623368.html http://blog.csdn.net/u012741077/article/details/ ...

  8. Spring 整合 Junit4 进行单元测试

    1. pom.xml 引入JAR依赖: <dependency> <groupId>junit</groupId> <artifactId>junit& ...

  9. Nginx-设定允许的ip和要拒绝的ip

    作用范围和配置的顺序有关系,先配置的优先级高,会覆盖和后一个配置重合的部分, 可以添加多个allow和多个deny: 1)这个配置127.0.0.1可以通过访问. allow 127.0.0.1; d ...

  10. Get Started with the Google Fonts API

    Get Started with the Google Fonts API This guide explains how to use the Google Fonts API to add fon ...