java jdk动态代理
在面试的时候面试题里有一道jdk的动态代理是原理,并给一个事例直接写代码出来,现在再整理一下
jdk动态代理主要是想动态在代码中增加一些功能,不影响现有代码,实现动态代理需要做如下几个操作
1.首先必须要有一个接口,被代理类必须实现这个接口(必须,原因是因为生成的代理类也实现这个接口,代理完得到的类可以用这个接口类型进接收)
2.需要写一个自己的代理处理类,现在给它起个名字叫MyHandler,必须实现InvocationHandler,重写invoke方法(这个也是必须,我们要在Invoke(Object proxy, Method method, Object[] args)方法里面写自己的逻辑,调用被代理类的方法,invoke(Object proxy, Method method, Object[] args)方法里面的三个参数的意思为:代理类,被代理类的哪个方法,这个方法的参数是什么)
3.MyHandler里面必须有一个成员变量,类型为Object,可以在构造方法的时候将这个成员变量的值赋进去(这个成员变量也是必须要有的,因为在invoke方法里面需要代理这个类执行这个对象的方法)
4.得到代理对象是通过Proxy类的newProxyInstance(ClassLoader loader, Class<?>[] interfaces, InvocationHandler h)方法得到,第一个是得到classLoader即可,第二个参数为接口,接口的数量可以多个,通过代理类可以得到:test.getClass().getInterfaces()就得到了,最后一个参数就是我们上面第2步里面自己写的代理类的实例,这样就得到了一个代理类,当然,是第一步定义的接口类型的,然后再调用得到这个对象,调用方法
代码如下,需求是在被代理类的move方法执行前后加打印语句行:
定义的接口:
public interface Inter {
void move();
}
再写一个被代理类,叫ProxyClazz
public class ProxyClazz implements Inter{ public void move(){
System.out.println("move...");
} }
处理代理的类:
public class TestProxy implements InvocationHandler{
//被代理类,必须做为这个类的成员变量
private Object target; public TestProxy(){
super();
}
//通过构造方法传值进来
public TestProxy(Object target) {
super();
this.target = target;
} @Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println("start");
//查看proxy类的命名方式:com.sun.proxy.$Proxy0
System.out.println(proxy.getClass().getName());
Object o = method.invoke(target, args);
System.out.println("end");
return o;
} }
测试用的main方法
public static void main(String[] args) throws Exception, Throwable{
Inter inter = new ProxyClazz();
TestProxy tp = new TestProxy(inter);
Inter interProxy =(Inter) Proxy.newProxyInstance(inter.getClass().getClassLoader(), inter.getClass().getInterfaces(), tp);
interProxy.move();
}
得到的结果为
start
com.sun.proxy.$Proxy0
move...
end
可以看到确实得到了代理类:$Proxy0
也满足了我们的需求,在新生成代理类中加入了我们想加入的功能
java jdk动态代理的更多相关文章
- Java JDK 动态代理使用及实现原理分析
转载:http://blog.csdn.net/jiankunking 一.什么是代理? 代理是一种常用的设计模式,其目的就是为其他对象提供一个代理以控制对某个对象的访问.代理类负责为委托类预处理 ...
- java jdk动态代理模式举例浅析
代理模式概述 代理模式是为了提供额外或不同的操作,而插入的用来替代”实际”对象的对象,这些操作涉及到与”实际”对象的通信,因此代理通常充当中间人角色. java中常用的动态代理模式为jdk动态代理和c ...
- Java JDK动态代理解析
动态代理虽不常自己实现,但在Spring或MyBatis中都有重要应用.动态代理的意义在于生成一个占位(又称代理对象),来代理真实对象,从而控制真实对象的访问.Spring常JDK和CGLIB动态代理 ...
- java jdk动态代理学习记录
转载自: https://www.jianshu.com/p/3616c70cb37b JDK自带的动态代理主要是指,实现了InvocationHandler接口的类,会继承一个invoke方法,通过 ...
- Java,JDK动态代理的原理分析
1. 代理基本概念: 以下是代理概念的百度解释:代理(百度百科) 总之一句话:三个元素,数据--->代理对象--->真实对象:复杂一点的可以理解为五个元素:输入数据--->代理对象- ...
- Java JDK 动态代理实现和代码分析
JDK 动态代理 内容 一.动态代理解析 1. 代理模式 2. 为什么要使用动态代理 3. JDK 动态代理简单结构图 4. JDK 动态代理实现步骤 5. JDK 动态代理 API 5.1 java ...
- java JDK动态代理的机制
一:前言 自己在稳固spring的一些特性的时候在网上看到了遮掩的一句话“利用接口的方式,spring aop将默认通过JDK的动态代理来实现代理类,不适用接口时spring aop将使用通过cgli ...
- Java JDK 动态代理(AOP)使用及实现原理分析
一.什么是代理? 代理是一种常用的设计模式,其目的就是为其他对象提供一个代理以控制对某个对象的访问.代理类负责为委托类预处理消息,过滤消息并转发消息,以及进行消息被委托类执行后的后续处理. 代理模式U ...
- java jdk动态代理(proxy)
1. 涉及主要jdk api java.lang.reflect.InvocationHandler: public interface InvocationHandler { /** * Proce ...
随机推荐
- 多线程爬取 threading.Thread 文件名支持gbk编码
# - *- coding:utf-8-*-import urllib2import reimport osimport threadingimport sysreload(sys)sys.setde ...
- oracle ORA-01427: 单行子查询返回多个行
ORA-01427: 单行子查询返回多个行 前几天开发的同事反馈一个问题,说前台系统报出了ORA错误,希望我们能看看是什么原因.java.sql.SQLException: ORA-01427: si ...
- transfromjs动画效果
记得以前facebook做过一款HTML5游戏.开场动画是一块软体类似豆腐的东西一起摇摆.类似的效果如下面的gif所示: facebook当时使用的是createjs下的子项目easeljs和twee ...
- ubuntu 搭建PPTP VPN服务器
上一篇文章介绍了如何在Ubuntu服务器上搭建IPSEC L2TP VPN服务器.继续介绍如何在Ubuntu服务器上搭建PPTP VPN服务器. 首先安装以下所需包 #apt-get install ...
- C++设计模式——简单工厂模式
简单工厂模式(Simple Factory Pattern) 介绍:简单工厂模式不能说是一个设计模式,说它是一种编程习惯可能更恰当些.因为它至少不是Gof23种设计模式之一.但它在实际的编程中经常被用 ...
- 你不知道的this指向
javascript中,我们预想的this指向,有时候与预期不一样,直接上经典例子 window.name=2; var test={ 'name':1, 'getName':function(){ ...
- http2协议翻译(转)
超文本传输协议版本 2 IETF HTTP2草案(draft-ietf-httpbis-http2-13) 摘要 本规范描述了一种优化的超文本传输协议(HTTP).HTTP/2通过引进报头字段压缩以及 ...
- 使用Carthage管理iOS依赖库
Carthage安装和使用和CocoaPods类似: 1.安装: 终端执行以下命令: $ brew update $ brew install carthage 查看Carthage的版本号: $ c ...
- Git学习(三)——暂存区、远程仓库、增删改管理
一.工作区和暂存区 工作区(Working Directory) 就是在你的电脑里能看到的目录 版本库(Repository) 工作区中的一个隐藏目录.git,这个不算工作区,而是Git版本库.Git ...
- List<Map<String,Object>>使用Java代码遍历
List<Map<String,Object>>的结果集怎么使用Java代码遍历以获取String,Object的值: package excel; import java.u ...