- 浏览: 600184 次
- 性别:
- 来自: 厦门
文章分类
- 全部博客 (669)
- oracle (36)
- java (98)
- spring (48)
- UML (2)
- hibernate (10)
- tomcat (7)
- 高性能 (11)
- mysql (25)
- sql (19)
- web (42)
- 数据库设计 (4)
- Nio (6)
- Netty (8)
- Excel (3)
- File (4)
- AOP (1)
- Jetty (1)
- Log4J (4)
- 链表 (1)
- Spring Junit4 (3)
- Autowired Resource (0)
- Jackson (1)
- Javascript (58)
- Spring Cache (2)
- Spring - CXF (2)
- Spring Inject (2)
- 汉字拼音 (3)
- 代理模式 (3)
- Spring事务 (4)
- ActiveMQ (6)
- XML (3)
- Cglib (2)
- Activiti (15)
- 附件问题 (1)
- javaMail (1)
- Thread (19)
- 算法 (6)
- 正则表达式 (3)
- 国际化 (2)
- Json (3)
- EJB (3)
- Struts2 (1)
- Maven (7)
- Mybatis (7)
- Redis (8)
- DWR (1)
- Lucene (2)
- Linux (73)
- 杂谈 (2)
- CSS (13)
- Linux服务篇 (3)
- Kettle (9)
- android (81)
- protocol (2)
- EasyUI (6)
- nginx (2)
- zookeeper (6)
- Hadoop (41)
- cache (7)
- shiro (3)
- HBase (12)
- Hive (8)
- Spark (15)
- Scala (16)
- YARN (3)
- Kafka (5)
- Sqoop (2)
- Pig (3)
- Vue (6)
- sprint boot (19)
- dubbo (2)
- mongodb (2)
最新评论
JDK基于接口代理
但是,JDK的动态代理依靠接口实现,如果有些类并没有实现接口,则不能使用JDK代理,这就要使用cglib动态代理了。
Cglib动态代理
JDK的动态代理机制只能代理实现了接口的类,而不能实现接口的类就不能实现JDK的动态代理,cglib是针对类来实现代理的,他的原理是对指定的目标类生成一个子类,并覆盖其中方法实现增强,但因为采用的是继承,所以不能对final修饰的类进行代理。
Cglib动态类代理
import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; import java.lang.reflect.Proxy; interface BookInterface { void addBook(); void intercept(); }; public class BookImpl implements BookInterface { public void addBook() { System.out.println("dynamic@BookImpl#addBook"); } public void intercept() { System.out.println("dynamic@BookImpl#intercept is intercepted..."); } // 测试方法 public static void main(String[] args) { BookProxy proxy = new BookProxy(); BookInterface impl = (BookInterface) proxy.getInstance(new BookImpl()); impl.intercept(); } }; /** * * @projectName:ActiveMq * @packageName: activeMQ.topicMessage * @ClassName : BookProxy * @createBy :Test * @createDate :2013-2-24下午01:23:25 * @useFor : * */ class BookProxy implements InvocationHandler { /** * 委托类 */ private Object target; public Object getInstance(Object target) { this.target = target; return Proxy.newProxyInstance(target.getClass().getClassLoader(), target.getClass().getInterfaces(), this); } public Object invoke(Object obj, Method method, Object[] args) throws Throwable { System.out.println("Before Advice"); if ("intercept".equals(method.getName())) { System.out.println("intercept method is intercepted"); return null; } // 注意此处的参数是注入的target 而不是obj Object result = method.invoke(target, args); System.out.println("After Advice"); return result; } }
但是,JDK的动态代理依靠接口实现,如果有些类并没有实现接口,则不能使用JDK代理,这就要使用cglib动态代理了。
Cglib动态代理
JDK的动态代理机制只能代理实现了接口的类,而不能实现接口的类就不能实现JDK的动态代理,cglib是针对类来实现代理的,他的原理是对指定的目标类生成一个子类,并覆盖其中方法实现增强,但因为采用的是继承,所以不能对final修饰的类进行代理。
Cglib动态类代理
import java.lang.reflect.Method; import net.sf.cglib.proxy.Enhancer; import net.sf.cglib.proxy.MethodInterceptor; import net.sf.cglib.proxy.MethodProxy; public class BookClass { /** * 业务方法 使用cglib则不需要额外定义接口 Description: <br> * * @see */ public void addBook() { System.out.println("cglib@BookClass#addBook"); } // 测试 public static void main(String[] args) { BookProxy proxy = new BookProxy(); BookClass bc = (BookClass) proxy.getInstance(new BookClass()); bc.addBook(); } }; /** * * @projectName:ActiveMq * @packageName: activeMQ.topicMessage * @ClassName : BookProxy * @createBy :Test * @createDate :2013-2-24下午01:31:22 * @useFor : Cglib 动态代理类 类代理 * */ class BookProxy implements MethodInterceptor { /** * 委托类 */ private Object target; public Object getInstance(Object target) { this.target = target; Enhancer en = new Enhancer(); en.setSuperclass(target.getClass()); en.setCallback(this); return en.create(); } public Object intercept(Object obj, Method method, Object[] args, MethodProxy proxy) throws Throwable { System.out.println("Before Advice"); // 注意此处的参数是注入的target 而不是obj Object result = proxy.invoke(target, args); System.out.println("After Advice"); return result; } };
发表评论
文章已被作者锁定,不允许评论。
-
java WeakHashMap学习(key是弱引用)
2018-06-21 09:31 1232在Java集合中有一种特殊的Map类型:WeakHashMap ... -
java HashMap TreeMap(key顺序) LinkedHashMap(插入顺序)学习
2018-06-07 10:27 953java为数据结构中的映射定义了一个接口java.util.M ... -
java RESTful 详解
2018-04-27 11:35 643(1)每一个URI代表一种资源,独一无二; (2)客户端 ... -
java 通过HttpsUrlConnection访问接口数据
2018-04-19 11:25 990server: ssl: key-stor ... -
java 使用多线程的场景总结
2018-04-10 14:35 1704在一个高并发的网站中,多线程是必不可少的。下面先说一下多线程在 ... -
java Enum枚举设置
2018-04-10 10:55 480/** * 数据状态:0:无效,1:有效 **/ ... -
java RestTemplate访问restful服务
2018-03-01 15:02 1622REST的基础知识 当谈论REST时,有一种常见的错误就是将其 ... -
java FYOpenApi实现短信发送
2018-01-02 17:10 11741.配置文件 sms.OpenUrl = http://s ... -
java JSONObject序列化包含Date类型数据的Java对象
2017-12-26 16:31 1617如果Date.class无法进行转换则使用Timestamp. ... -
java 用HttpsURLConnection进行传递中文时错误总结
2017-12-07 16:42 654传递中文时需要用Writer而不是OutputStream ... -
java 内存泄漏
2017-11-27 13:51 4961.内存溢出 out of memory ... -
ActiveMQ 三种发送消息方式(同步,异步,单向)
2017-11-17 10:25 2454MQ 发送普通消息有三种实现方式:可靠同步发送、可靠异步发送、 ... -
java Guava ListenableFuture实现线程回调功能
2017-11-14 10:17 1775java Future具有局限性。在实际应用中,当需要下 ... -
java Curator实现分布式锁
2017-09-05 14:39 1090Curator实现分布式锁主要依赖于zookeeper ... -
java Guava工具集学习(强大)
2017-09-05 10:28 433import java.util.Iterator ... -
java CyclicBarrier进行并发编程
2017-08-25 15:44 673CyclicBarrier允许一组线程相互等待达到一个公共的障 ... -
java 几种性能优化的总结
2017-08-23 14:08 3251、使用StringBuilder 一般 ... -
java 使用kyro进行高性能序列化对象和集合
2017-08-23 14:05 2152import java.io.ByteArrayInp ... -
java 对重复电话号码进行排除的优化(排序和前后对比)
2017-08-22 14:14 7911.先对10万数据排序; 2.对比前后两条数据 ; 3.筛 ... -
ActiveMQ 结合Spring进行数据同步
2017-07-19 15:27 584注意事项hibernate配置文件必须设置自动提交否则不能插入 ...
相关推荐
JDK动态代理基于接口实现,它要求被代理的类必须实现至少一个接口。在运行时,Java会动态地创建一个新的类,这个类实现了与原始类相同的接口,并且在调用接口方法时,可以插入自定义的逻辑。这样,我们就可以在不...
5. 兼容性:JDK代理是Java标准库的一部分,而Cglib是第三方库,可能受到JVM版本和类加载器限制的影响。 总结来说,JDK代理和Cglib代理都是为了在运行时动态创建代理对象,以扩展或修改已有对象的行为。选择哪种方式...
Java动态代理是Java编程中一...JDK动态代理适用于接口代理,简单易用,而CGLIB则适用于非接口类的代理,提供了更广泛的应用场景。理解并熟练掌握这两种动态代理机制,对于提升Java开发的灵活性和可维护性具有重要意义。
这是因为 JDK 动态代理是基于接口的代理,它需要一个接口来生成代理类。如果我们想使用 JDK 动态代理,必须提供一个接口,并且将其实现类交给 JDK 动态代理来生成代理类。 CGLIB 动态代理是基于类的代理, 它可以...
在选择代理方式时,需要根据项目需求、性能要求和类设计来决定。"Spring_aop3"可能是Spring AOP的进一步讲解,包括AOP的其他概念,如切入点表达式、通知类型等,这些对于理解AOP代理的使用至关重要。 了解这两种...
JDK动态代理基于Java的反射API,它要求被代理的目标对象必须实现一个或多个接口。JDK动态代理的核心类是`java.lang.reflect.Proxy`和`java.lang.reflect.InvocationHandler`。`Proxy`类用于创建动态代理实例,而`...
1. **JDK动态代理** - 基于接口实现的动态代理。 2. **CGLIB动态代理** - 基于继承实现的动态代理。 **JDK动态代理实现:** JDK动态代理主要依赖于`java.lang.reflect.Proxy`类和`java.lang.reflect....
与JDK动态代理不同的是,CGLIB不需要目标类实现接口,而是通过继承的方式为一个现有的类创建子类并实现增强功能。 CGLIB代理的核心在于它能够为一个类创建一个子类,并在子类中拦截方法调用。这种方式使得CGLIB在...
性能方面,CGLIB通常比JDK动态代理更快,因为它是基于字节码生成的子类,而JDK动态代理需要创建接口的实现类。但是,如果目标类已经实现了接口,JDK动态代理的性能开销相对较小,因为它避免了子类继承带来的额外成本...
**JDK代理**是基于接口的代理,它通过`java.lang.reflect.Proxy`类和`java.lang.reflect.InvocationHandler`接口实现。当我们的目标对象实现了特定的接口时,我们可以使用JDK动态代理来创建该对象的代理。以下是JDK...
- **CGLIB代理**适用于目标类没有接口或者不希望修改原有接口的情况,其性能通常优于JDK代理,因为它是基于字节码生成的子类,而JDK代理需要反射调用接口方法。 在实际开发中,如Spring AOP框架就同时支持JDK和...
总结,Java动态代理提供了在运行时创建和增强类的能力,JDK动态代理适用于接口代理,而CGLIB则适用于无接口或需代理非接口方法的情况。了解和熟练掌握这两种动态代理机制对于提升Java开发能力至关重要。
3. **优点**:由于基于接口,JDK动态代理具有良好的类型安全性和易于理解的API。而且,因为使用了Java内置支持,性能相对较好。 **CGLIB动态代理**: CGLIB是一个第三方的字节码生成库,广泛应用于Spring AOP框架中...
JDK动态代理基于Java反射API实现,主要用于接口代理。以下是一个简单的JDK动态代理的使用步骤: 1. **定义接口**:首先,我们需要定义一个或多个接口,这些接口将由代理类实现。例如: ```java public interface ...
JDK动态代理基于Java的反射API实现,适用于接口代理。当目标对象实现了至少一个接口时,Spring会创建一个代理对象,这个代理对象实现了与目标对象相同的接口,并在调用接口方法时插入额外的切面逻辑。代理对象在运行...
Java.lang.reflect.Proxy类和java.lang.reflect.InvocationHandler接口是实现JDK动态代理的关键。Proxy类提供了一个静态方法`newProxyInstance()`,该方法接收三个参数:一个ClassLoader对象、一个接口数组以及一个...
JDK动态代理基于接口实现,它要求被代理的对象必须实现至少一个接口。通过`java.lang.reflect.Proxy`类和`java.lang.reflect.InvocationHandler`接口,我们可以创建并控制代理对象的行为。`Proxy`类提供了`...
JDK动态代理基于Java的接口机制实现,因此,要使用JDK动态代理,被代理的目标类必须实现至少一个接口。`java.lang.reflect.Proxy`类和`java.lang.reflect.InvocationHandler`接口是JDK动态代理的核心。Proxy类用于...