动态代理Dynamic Proxy

代理模式是常用的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的更多相关文章
- Java的动态代理(dynamic proxy)
什么是动态代理(dynamic proxy) 动态代理(以下称代理),利用Java的反射技术(Java Reflection),在运行时创建一个实现某些给定接口的新类(也称“动态代理类”)及其实例(对 ...
- Java动态代理一Proxy
什么是动态代理? 动态代理可以提供对另一个对象的访问,同时隐藏实际对象的具体事实.代理一般会实现它所表示的实际对象的接口.代理可以访问实际对象,但是延迟实现实际对象的部分功能,实际对象实现系统的实际功 ...
- Java-马士兵设计模式学习笔记-代理模式-动态代理 调用Proxy.newProxyInstance()
一.概述 1.目标:不自己写代理类,利用Proxy.newProxyInstance()动态生成 2.用到的知识点: (1)//编译源码,生成class,注意编译环境要换成jdk才有compiler, ...
- java 动态代理学习(Proxy,InvocationHandler)
前几天看到java的动态代理机制,不知道是啥玩意,然后看了看.死活不知道 invoke(Object proxy, Method m, Object[] args)种的proxy是个什么东西,放在这里 ...
- java jdk动态代理(proxy)
1. 涉及主要jdk api java.lang.reflect.InvocationHandler: public interface InvocationHandler { /** * Proce ...
- Java中的动态代理以及Proxy类的偷瞄
动态代理机制 所谓动态代理,即通过代理类Proxy的代理,接口和实现类之间可以不直接发生联系,而可以在运行期(Runtime)实现动态关联. Java动态代理类位于Java.lang.reflect包 ...
- java动态代理、Proxy与InvocationHandler
看了好多关于代理的文章,理解和整理一下. 1.代理的基本构成 抽象角色:声明真实对象和代理对象的共同接口,这样可在任何使用真实对象的地方都可以使用代理对象. 代理角色:代理对象内部含有真实对象的引用, ...
- Java的动态代理
什么是动态代理(dynamic proxy) 动态代理(以下称代理),利用Java的反射技术(Java Reflection),在运行时创建一个实现某些给定接口的新类(也称“动态代理类”)及其实例(对 ...
- Cglib 与 JDK动态代理的运行性能比较
都说 Cglib 创建的动态代理的运行性能比 JDK 动态代理能高出大概 10 倍,今日抱着怀疑精神验证了一下,发现情况有所不同,遂贴出实验结果,以供参考和讨论. 代码很简单,首先,定义一个 Test ...
随机推荐
- sublime text 3 安装卸载插件和取消启动检查更新
1.Perferences->Package Contro,输入install 调出 Install Package 选项并回车 2.安装相应的插件 2.点击首选项–设置(用户) 3.卸载插件 ...
- linux每日命令(19):locate 命令
locate 让使用者可以很快速的搜寻档案系统内是否有指定的档案.其方法是先建立一个包括系统内所有档案名称及路径的数据库,之后当寻找时就只需查询这个数据库,而不必实际深入档案系统之中了.在一般的 di ...
- Python3用gevent写个文件字符串查找器
[本文出自天外归云的博客园] 1.递归遍历目录下所有文件并通过finder函数定位指定格式字符串 2.用来查找字符串的finder函数是自己定义的,这里定义了一个ip_port_finder通过正则表 ...
- 怎么关闭win10和win8快速启动
电源选项-- 选择电源按钮的功能--- 更改当前不可用的设置-- 快速启动勾去掉
- Spring Mvc 入门Demo
1.web.xml配置 <?xml version="1.0" encoding="UTF-8"?> <web-app xmlns=" ...
- android 中的一些资源注解,让编译器帮你检查代码
android 中的一些资源注解,让编译器帮你检查代码 写方便的时候可以用注解来声明一些参数,以明确的指示参数的类型,让代码更安全.我们看到,在android源代码里大量使用了注解.我整理了一些注解如 ...
- hdoj:2031
#include <iostream> #include <string> using namespace std; int main() { int N,R; string ...
- Android Things:撸起袖子来创建第一个Things工程
http://blog.csdn.net/p106786860/article/details/60161020 ——————————————————————————————————————————— ...
- linux 斜杠/
inux OS: 使用”/“ 例子:/home/user/XXX 特例:路径中某目录名包含空格,在命令行中使用cd等命令书写路径时,则要在空格前加”\“ 例子: 主目录(/home/student ...
- ABBYY PDF Transformer+系统要求
ABBYY PDF Transformer+是一个新的,全面的巧妙解决PDF文档的工具,它将泰比的光学字符识别(OCR)技术和Adobe®PDF技术完美结合,以确保实现便捷地处理任何类型的PDF文件, ...