- 浏览: 162205 次
- 性别:
- 来自: 上海
文章分类
最新评论
-
youjianbo_han_87:
jredis有连接池啊
Jedis操作redis -
zhouzq1008:
就是,为什么只有4.0
eclipse 安装 resin 3 步骤 (转) -
lalaeye:
是的,如果不释放资源的话,如果操作连接频繁的话,或导致打开太多 ...
Jedis操作redis -
hugh.wang:
还好,注意释放一下资源~~
Jedis操作redis -
nihao7010:
先赞一下再仔细阅读
Jedis操作redis
在Java中,动态代理是指代理类的生成发生在程序运行时期,根据被代理类动态生成代理类的字节码文件(class文件),并且装载到运行环境中,像其他的类一样使用,该字节码文件的生存期随着运行环境的关闭而消失。
首先来一些接口的说明:
InvocationHandler接口
它定义了唯一的方法invoke,该方法的参数为代理对象proxy,截获的方法对象method,和方法调用的参数,返回方法执行的结果。
开发者需要实现该接口,在invoke方法中添加对截获的方法的代理操作,并调用被代理对象的方法。
Proxy类
该类是生成代理类的帮助类,它的几个主要方法如下:
public Static Class getProxyClass (ClassLoader loader, Class[] interfaces):根据指定的类加载器和接口获得一个代理类,其中,loader是类加载器,interfaces是被代理类所拥有的接口。
public Static Object newProxyInstance(ClassLoader loader, Class[] interfaces, InvocationHandler h):根据指定的类加载器、接口以及截获器,返回代理类的一个实例对象。
如下写了一个小例子:
一个空的Bean:
一个接口:
一个接口的实现:
一个ProxyFactory:
最后是客户端调用:
最后总结一下:
分析JDK提供的帮助类Proxy,可以发现,它只支持实现接口方式的代理,不支持继承超类方式的代理,这就意味着,被代理的类必须要有接口,并且需要拦截的方法必须都在接口中进行声明。在本例中,通过截获帮助类Proxy生成的代理类的字节码文件,反编译之后,发现,其类的声明如下:
public final class proxy0 extends Proxy implements Command
其中,proxy0就是动态生成的代理类的名字,在该类的方法中,都会将调用委托到拦截器的invoker方法。
因为JDK提供的动态代理仅支持接口方式的代理,那么如果被代理的类没有实现任何接口,如何处理呢?后续将探讨基于CGLib的动态代理,它同时也支持继承超类的方式的代理。
注:文字部分转自互联网
首先来一些接口的说明:
InvocationHandler接口
它定义了唯一的方法invoke,该方法的参数为代理对象proxy,截获的方法对象method,和方法调用的参数,返回方法执行的结果。
开发者需要实现该接口,在invoke方法中添加对截获的方法的代理操作,并调用被代理对象的方法。
Proxy类
该类是生成代理类的帮助类,它的几个主要方法如下:
public Static Class getProxyClass (ClassLoader loader, Class[] interfaces):根据指定的类加载器和接口获得一个代理类,其中,loader是类加载器,interfaces是被代理类所拥有的接口。
public Static Object newProxyInstance(ClassLoader loader, Class[] interfaces, InvocationHandler h):根据指定的类加载器、接口以及截获器,返回代理类的一个实例对象。
如下写了一个小例子:
一个空的Bean:
package com.jzkangta.demo.bean; public class Person { private String name; public String getName() { return name; } public void setName(String name) { this.name = name; } }
一个接口:
package com.jzkangta.demo.dao; import com.jzkangta.demo.bean.Person; public interface PersonDao { public void savePerson(); public void updatePerson(); public void deletePerson(); public Person findPerson(); }
一个接口的实现:
package com.jzkangta.demo.dao.impl; import com.jzkangta.demo.bean.Person; import com.jzkangta.demo.dao.PersonDao; public class PersonDaoImpl implements PersonDao { @Override public void deletePerson() { // TODO Auto-generated method stub System.out.println("删除用户了........"); } @Override public Person findPerson() { // TODO Auto-generated method stub System.out.println("查找用户了........"); return null; } @Override public void savePerson() { // TODO Auto-generated method stub System.out.println("添加用户了........"); } @Override public void updatePerson() { // TODO Auto-generated method stub System.out.println("修改用户了........"); } }
一个ProxyFactory:
package com.jzkangta.demo.aop; import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; import java.lang.reflect.Proxy; public class ProxyFactory implements InvocationHandler { private Object targetObject; // 需要代理的目标对象 //创建代理对象 也可以用构造方法来做 public Object createProxyIntance(Object targetObject) { this.targetObject = targetObject; return Proxy.newProxyInstance(this.targetObject.getClass() .getClassLoader(),// 第一个参数为代理目标对象的类装载器 this.targetObject.getClass().getInterfaces(), // 第二个参数为代理目标对象的所有接口,Proxy会为该目标类实现其下所有的接口 this); // 第三个参数是当拦截到代理请求的时候,使用哪个来处理代理 一般为代理的类 当前类 该类必须实现implements // InvocationHandler接口,然后执行invoke方法 } @Override public Object invoke(Object arg0, Method method, Object[] arg2) throws Throwable { testFunction(); //此处可以加逻辑判断,只有正确才执行method.invoke方法 Object result = method.invoke(targetObject, arg2); //这里是指需要调用目标代理对象的最终方法 return result; } public void testFunction(){ System.out.println("执行额外的功能方法........."); } }
最后是客户端调用:
package com.jzkangta.demo; import com.jzkangta.demo.aop.ProxyFactory; import com.jzkangta.demo.dao.PersonDao; import com.jzkangta.demo.dao.impl.PersonDaoImpl; public class Test { /** * @param args */ public static void main(String[] args) { // TODO Auto-generated method stub ProxyFactory proxyFactory = new ProxyFactory(); PersonDao personDao = (PersonDao)proxyFactory.createProxyIntance(new PersonDaoImpl()); personDao.savePerson(); } }
最后总结一下:
分析JDK提供的帮助类Proxy,可以发现,它只支持实现接口方式的代理,不支持继承超类方式的代理,这就意味着,被代理的类必须要有接口,并且需要拦截的方法必须都在接口中进行声明。在本例中,通过截获帮助类Proxy生成的代理类的字节码文件,反编译之后,发现,其类的声明如下:
public final class proxy0 extends Proxy implements Command
其中,proxy0就是动态生成的代理类的名字,在该类的方法中,都会将调用委托到拦截器的invoker方法。
因为JDK提供的动态代理仅支持接口方式的代理,那么如果被代理的类没有实现任何接口,如何处理呢?后续将探讨基于CGLib的动态代理,它同时也支持继承超类的方式的代理。
注:文字部分转自互联网
发表评论
-
权重算法实现(转)
2011-12-26 11:28 4157原文地址:http://www.blogjava.net/wi ... -
Mongodb的带用户验证replica set配置
2011-10-18 17:14 2831这些天捣鼓了一下mongodb的replica set 本人初 ... -
Java正则(转)
2011-10-13 09:24 961首先说一下java正则表达式的重点概念: 第一、相关类:Pa ... -
Linux下查看某端口占用进程(转)
2011-10-12 11:18 949在Linux操作系统中 查看占用某一端口的进程是什么:#l ... -
easyUi
2011-08-12 16:09 1016原文地址:http://www.ityizhan.com/jq ... -
maven3
2011-08-12 11:56 889原文地址:http://suhuanzheng7784877. ... -
hadoop资料
2011-08-03 16:46 868网上下的,详见附件 -
九 redis学习笔记之虚拟内存(转)
2011-08-02 15:53 988原文地址:http://www.cnblogs.com/xha ... -
八 redis学习笔记之主从复制(转)
2011-08-02 15:53 1050原文地址:http://www.cnblo ... -
六 redis学习笔记之发布订阅(转)
2011-08-02 15:52 1401原文地址:http://www.cnblogs.com/xha ... -
五 redis学习笔记之pipeline(转)
2011-08-02 15:51 967原文地址:http://www.cnblogs.com/xha ... -
四 redis学习笔记之事务(转)
2011-08-02 15:50 987原文地址:http://www.cnblogs.com/xha ... -
三 redis学习笔记之排序(转)
2011-08-02 15:49 1122原文地址:http://www.cnblogs.com/xha ... -
二 redis学习笔记之数据类型(转)
2011-08-02 15:49 1032原文地址:http://www.cnblogs.com/xha ... -
一 redis学习笔记之环境搭建(转)
2011-08-02 15:47 803原文地址:http://www.cnblo ... -
redis学习笔记之持久化(转)
2011-08-02 15:41 845原文地址:http://www.cnblo ... -
redis安装指南(转)
2011-08-01 17:04 964原文地址:http://mwt198668.blog.163. ... -
Jedis操作redis
2011-08-01 16:51 19554package org.jzkangta.jedis; ... -
java操作mongoDB
2011-04-26 16:46 6933这段时间一直在研究mongoDB,由于资料很少,网上的又都是互 ... -
log4j配置(转)
2011-03-30 12:17 575原文地址:http://www.blogjava.net/zJ ...
相关推荐
本文将深入探讨两种主要的Java代理实现:JDK动态代理和CGLIB代理。 一、JDK动态代理 JDK动态代理基于接口实现,它要求被代理的类必须实现至少一个接口。在运行时,Java会动态地创建一个新的类,这个类实现了与原始...
JDK动态代理的核心API包括`java.lang.reflect.Proxy`和`java.lang.reflect.InvocationHandler`。 - **`java.lang.reflect.Proxy`**:提供了创建动态代理类和实例的方法。通过`newProxyInstance`方法,传入...
### 关于JDK动态代理的源码剖析 #### 一、引言 在Java开发过程中,动态代理技术是一项非常实用的技术,它可以帮助我们实现在不修改原有代码的基础上为方法增加额外的功能,比如日志记录、权限校验等。本文将深入...
首先,JDK动态代理主要依赖于java.lang.reflect.Proxy类和java.lang.reflect.InvocationHandler接口。Proxy类用于创建一个代理对象,而InvocationHandler接口则定义了处理代理对象调用方法的逻辑。当调用代理对象的...
Java JDK 动态代理是一种强大的特性,它允许我们在运行时创建代理对象,这些代理对象可以扩展或增强已存在的接口实现。动态代理在处理AOP(面向切面编程)场景、事件监听、性能监控等方面有着广泛的应用。下面我们将...
Java 动态代理详解(代理模式+静态代理+JDK动态代理+CGLIB动态代理) Java 动态代理是 Java 编程语言中的一种强大工具,广泛应用于 Spring AOP、Hibernate 数据查询、测试框架的后端 mock、RPC 远程调用、Java 注解...
Java JDK 动态代理是一种强大的特性,它允许我们在运行时创建代理对象,这些代理对象能够拦截方法调用并在调用前后执行自定义的行为。在Java中,动态代理主要通过`java.lang.reflect.Proxy`类和`java.lang.reflect....
JDK动态代理的优点是它完全符合Java语言规范,不需要依赖额外的库,但缺点是只能对实现了接口的类进行代理,无法处理未实现接口的类。 **CGLib动态代理**: CGLib(Code Generation Library)是一个高性能的代码...
JDK 动态代理是 Java 自带的动态代理机制,它只能代理接口,而不能代理类。这是因为 JDK 动态代理是基于接口的代理,它需要一个接口来生成代理类。如果我们想使用 JDK 动态代理,必须提供一个接口,并且将其实现类...
Java JDK 动态代理是一种强大的特性,它允许我们在运行时创建代理类,这些代理类可以扩展或修饰已存在的接口实现。动态代理在很多场景下非常有用,比如日志记录、性能监控、事务管理等,这些功能可以在不修改原始...
JDK动态代理主要通过`java.lang.reflect.Proxy`类和`java.lang.reflect.InvocationHandler`接口来实现。Proxy类用于创建一个代理对象,而InvocationHandler接口定义了处理代理对象的方法调用的逻辑。当通过Proxy创建...
JDK动态代理基于Java的反射API,它要求被代理的目标对象必须实现一个或多个接口。JDK动态代理的核心类是`java.lang.reflect.Proxy`和`java.lang.reflect.InvocationHandler`。`Proxy`类用于创建动态代理实例,而`...
动态代理主要分为两种:JDK代理和CGLIB代理。 **JDK代理**是基于接口的代理,它通过`java.lang.reflect.Proxy`类和`java.lang.reflect.InvocationHandler`接口实现。当我们的目标对象实现了特定的接口时,我们可以...
Java提供了两种主要的动态代理实现方式:JDK动态代理和CGLIB库。 首先,我们来看JDK动态代理。JDK动态代理基于Java的反射机制,它要求被代理的类必须实现一个或多个接口。通过`java.lang.reflect.Proxy`类和`java....
InvocationHandler 接口是 JDK 中和动态代理直接相关的主要接口之一。该接口相当于 Proxy 类的 CallBack Interface,定义了一个方法 Object:invoke(Object obj, Method method, Object[] args)。第一个参数 proxy ...
在Java编程领域,JDK动态代理是一个非常重要的概念,它允许我们在运行时动态地创建一个实现了特定接口的代理对象,以此来拦截并扩展原有对象的行为。动态代理在很多场景下都有应用,比如AOP(面向切面编程)、事件...
动态代理是使用jdk的反射机制,创建对象的能力, 创建的是代理类的对象。 而不用你创建类文件。不用写java文件。 动态:在程序执行时,调用jdk提供的方法才能创建代理类的对象。jdk动态代理,必须有接口,目标类必须...
JDK动态代理是Java编程中一个非常重要的特性,它允许我们在运行时创建具有特定接口的代理类实例。这种技术在很多场景下都非常有用,比如在AOP(面向切面编程)中实现方法拦截、日志记录、事务管理等。下面我们将深入...
JDK动态代理和CGlib动态代理是Java中实现这一目标的两种主要方式。 ### JDK动态代理 JDK动态代理基于Java的接口实现。如果一个类实现了至少一个接口,我们就可以为这个类创建一个动态代理。动态代理通过`java.lang....
Java提供了两种主要的动态代理实现方式:JDK动态代理和CGLIB动态代理。 **JDK动态代理**: JDK动态代理基于接口实现,也就是说,被代理的对象必须实现至少一个接口。代理机制的核心是`java.lang.reflect.Proxy`类和...