代理模式是常用的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. mysql服务启动、停止、重启

    如何启动/停止/重启MySQL 一.启动方式 1.使用 service 启动:service mysqld start 2.使用 mysqld 脚本启动:/etc/inint.d/mysqld sta ...

  2. tensorflow 笔记10:tf.nn.sparse_softmax_cross_entropy_with_logits 函数

    函数:tf.nn.sparse_softmax_cross_entropy_with_logits(_sentinel=None,labels=None,logits=None,name=None) ...

  3. PX4/PixHawk无人机飞控应用开发

    最近做的一个国防背景的field UAV项目,细节不能多谈,简单写点技术体会. 1.PX4/Pixhawk飞控软件架构简介 PX4是目前最流行的开源飞控板之一.PX4的软件系统实际上就是一个firmw ...

  4. 【Linux高级驱动】网卡驱动分析

    两个重要的结构体简单介绍 *sk_buff 如果把网络传输看成是运送货物的话,那么sk_buff就是这个“货物”了,所有经手这个货物的人都要干点什么事儿,要么加个包装,要么印个戳儿等等.收货的时候就要 ...

  5. 小米手机安装mitmproxy证书

    [本文出自天外归云的博客园] 问题描述 小米手机在连接mitmproxy代理后通过浏览器访问mitm.it下载android证书后无法成功安装证书 设备:Redmi Note 2(红米手机) 解决方法 ...

  6. 【Unity】ShareSDK、SMSSDK的基本使用与常见问题

    概要 测试使用ShareSDK的一些常用功能.包括: 用微博帐号做第三方登录 获取用户的帐号详细信息 获取好友列表 分享功能 测试使用SMSSDK插件,包括: 导入插件,解决包冲突 短信登录功能:发验 ...

  7. C++ 成员函数赋值给C 的函数指针的采坑录

    最近做一个banana Pi M1+的硬解码器封装成类的时候,由于是依赖ffmpeg的,而ffmpeg是C 实现的,本来demo 都是直接用C写的,测试也没有问题,想着封装也不会有问题,至少自己对C+ ...

  8. 30. Substring with Concatenation of All Words

    题目: You are given a string, s, and a list of words, words, that are all of the same length. Find all ...

  9. windows server 2008 R2 计划任务备份系统

    实验环境拓扑图: 实验效果: Windows Server Backup 可以设置备份计划,但只能按日进行备份,不能设置按周或月进行备份.所以,需要使用到 windows Server 2008 R2 ...

  10. 一起了解下Centos中‘vim配置’有多强大?

    在linux的系统上安装vim编辑器后,发现vim的页面设置还是不太习惯,没有显示的行号,也没有自动的缩进,页面的背景也不是很好看,但是vim编辑器是可以进行配置的,我们可以打造属于自己的vim风格. ...