JDK动态代理具体解释
首先说一下动态代理和静态代理的差别:
静态代理:是预先写好或由特定工具自己主动生成的代码。再对其编译。在程序执行前。代理类的.class文件就已经存在了。
动态代理:代理是在程序执行时,运用反射机制动态创建而成的,程序执行之前,代理是不存在的。
Java的静态代理最简单的场景,一个接口,一个实现类,一个代理类就能够搞定。这个代理类持有接口实现类的引用,这样便能够实现托付对象的增强了。
Java的动态代理主要有两种。JDK动态代理和cglib动态代理
当中JDK动态代理,主要利用了接口InvocationHandler,还有Proxy类。
InvocationHandler接口:
public interface InvocationHandler {
public Object invoke(Object proxy,Method method,Object[] args) throws Throwable;
}
參数说明:
Object proxy:指代理对象。
Method method:要调用的方法
Object[] args:方法调用时所须要的參数
Proxy类:
Proxy类是专门完毕代理的操作类,能够通过此类为一个或多个接口的实现类动态地生成代理类,此类提供了例如以下的操作方法:
public static Object newProxyInstance(ClassLoader loader, Class<?>[] interfaces, InvocationHandler h) throws IllegalArgumentException
參数说明:
ClassLoader loader:类载入器
Class<?
>[] interfaces:得到所有的接口
InvocationHandler h:得到InvocationHandler接口的子类实例
动态代理类的字节码在程序执行时由Java反射机制动态生成。无需程序猿手工编写它的源码。动态代理类不仅简化了编程工作,并且提高了软件系统的可扩展性。由于Java 反射机制能够生成随意类型的动态代理类。java.lang.reflect 包中的Proxy类和InvocationHandler 接口提供了生成动态代理类的能力。 以下看一下我写的一个小样例~
package go.derek; interface Istudy
{
public void study(String words);
}
上面的接口定义了一个方法。
以下是这个接口的实现类
package go.derek; class StudyImpl implements Istudy
{
public void study(String words){
System.out.println(words);
}
}
以下看一下代理类的代码
package go.derek; import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
class StudyProxy implements InvocationHandler
{
private Object target;
public Object bind(Object target){
this.target=target;
return Proxy.newProxyInstance(target.getClass().getClassLoader(), target.getClass().getInterfaces(), this);
} public Object invoke(Object proxy,Method method,Object[] args) throws Throwable{
System.out.println("start");
Object obj=method.invoke(target,args);
System.out.println("rest");
return obj;
} }
以下是測试类的代码
package go.derek; class ProxyTest
{
public static void main(String[] args)
{
StudyProxy sp=new StudyProxy();
Istudy derek=(Istudy)sp.bind(new StudyImpl());
derek.study("I'm derek");
}
}
以下是输出结果:
start
I'm derek
rest
我们能够看出,代理类确实给托付类实现了增强,不能忽视的是代理类要持有托付类对象的引用。
JDK的动态代理机制仅仅能代理实现了接口的类,而不能实现接口的类就不能实现JDK的动态代理。cglib是针对类来实现代理的,他的原理是对指定的目标类生成一个子类,并覆盖当中方法实现增强,但由于採用的是继承。所以不能对final修饰的类进行代理。
JDK动态代理具体解释的更多相关文章
- JDK动态代理
一.基本概念 1.什么是代理? 在阐述JDK动态代理之前,我们很有必要先来弄明白代理的概念.代理这个词本身并不是计算机专用术语,它是生活中一个常用的概念.这里引用维基百科上的一句话对代理进行定义: A ...
- 【原创】JDK动态代理,此次之后,永生难忘。
动态代理,这个词在Java的世界里面经常被提起,尤其是对于部分(这里强调“部分”二字,因为有做了一两年就成大神的,实力强的令人发指,这类人无疑是非常懂动态代理这点小伎俩的)做了一两年新人来说,总是摸不 ...
- MyBatis Mapper 接口如何通过JDK动态代理来包装SqlSession 源码分析
我们以往使用ibatis或者mybatis 都是以这种方式调用XML当中定义的CRUD标签来执行SQL 比如这样 <?xml version="1.0" encoding=& ...
- JDK 动态代理分析
Java的代理有两种:静态代理和动态代理,动态代理又分为 基于jdk的动态代理 和 基于cglib的动态代理 ,两者都是通过动态生成代理类的方法实现的,但是基于jdk的动态代理需要委托类实现接口,基于 ...
- JDK动态代理[4]----ProxyGenerator生成代理类的字节码文件解析
通过前面几篇的分析,我们知道代理类是通过Proxy类的ProxyClassFactory工厂生成的,这个工厂类会去调用ProxyGenerator类的generateProxyClass()方法来生成 ...
- Java JDK动态代理解析
动态代理虽不常自己实现,但在Spring或MyBatis中都有重要应用.动态代理的意义在于生成一个占位(又称代理对象),来代理真实对象,从而控制真实对象的访问.Spring常JDK和CGLIB动态代理 ...
- JDK动态代理给Spring事务埋下的坑!
一.场景分析 最近做项目遇到了一个很奇怪的问题,大致的业务场景是这样的:我们首先设定两个事务,事务parent和事务child,在Controller里边同时调用这两个方法,示例代码如下: 1.场景A ...
- 转:jdk动态代理实现
原文链接: jdk动态代理 注:文章中用常用的流程实现 动态代理,流程逻辑比较清晰.文章后面对 “为什么要使用接口” 原理分析还未细看. jdk的动态代理为什么用接口,内部是什么原理呢?看了几篇文章貌 ...
- (转)面试必备技能:JDK动态代理给Spring事务埋下的坑!
一.场景分析 最近做项目遇到了一个很奇怪的问题,大致的业务场景是这样的:我们首先设定两个事务,事务parent和事务child,在Controller里边同时调用这两个方法,示例代码如下: 1.场景A ...
随机推荐
- 在Docker里使用(支持镜像继承的)supervisor管理进程(转)
这篇文章是受 dockboard 之托帮忙翻译的与 docker 有关的技术文章.译自 Using Supervisor with Docker to manage processes (suppor ...
- 彻底删除Oracle 11g的方法
1.关闭oracle所有的服务. 可以在windows的服务管理器中关闭. 2.打开注册表:regedit 打开路径:HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlS ...
- python-__init__.py 与模块对象的关系
python中的Module是比较重要的概念.常见的情况是,事先写好一个.py文件,在另一个文件中需要import时,将事先写好的.py文件拷贝 到当前目录,或者是在sys.path中增加事先写好的. ...
- jQuery自动加载更多程序(转)
jQuery自动加载更多程序 1.1.1 摘要 现在,我们经常使用的微博.微信或其他应用都有异步加载功能,简而言之,就是我们在刷微博或微信时,移动到界面的顶端或低端后程序通过异步的方式进行加载数据 ...
- Lintcode---区间求和 I
给定一个整数数组(下标由 0 到 n-1,其中 n 表示数组的规模),以及一个查询列表.每一个查询列表有两个整数 [start, end] . 对于每个查询,计算出数组中从下标 start 到 end ...
- Mac Yosemite上安装macvim和YouCompleteMe
今天在macvim上安装YouCompleteMe的时候,碰到一个运行vim崩溃的错误.查了半天终于解决! 先上一下安装macvim的过程 # install xcode and command li ...
- makefile之目录搜索&自动依赖
目录搜索 在一个大工程中,一般会将源文件和中间生成文件放在不同的目录,而且不会污染源码所在的目录.当需要编译不同目录下的源文件时,就需要指定路径,那么怎样让路径的表示以及源文件的引用更加灵活.就要用到 ...
- php的颜色定义表
http://outofmemory.cn/code-snippet/1960/php-color-define-table <? /////////////////////////////// ...
- jdbc.properties
#privilege database privilege.jdbc.driverClassName=com.mysql.jdbc.Driver privilege.jdbc.url=jdbc\:my ...
- SAML2.0 协议初识(三)——IDP
IDP,即提供身份认证服务的一端,通常,当 IDP 接收到 SP 发送的 SAML 认证请求后,解析 SAMLRequest 参数,包括 acs 地址.SP EntityId.绑定方式.是否加密等信息 ...