1.JDK动态代理:所要代理的类必须实现了接口。
public class JDKProxyFactory implements InvocationHandler{
private Object targetObject;
public Object createProxyIntance(Object targetObject){
this.targetObject = targetObject;
return Proxy.newProxyInstance(this.targetObject.getClass().getClassLoader(),
this.targetObject.getClass().getInterfaces(), this);
}
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {//环绕通知
PersonServiceBean bean = (PersonServiceBean) this.targetObject;
Object result = null;
if(bean.getUser()!=null){
//..... advice()-->前置通知
try {
result = method.invoke(targetObject, args);
// afteradvice() -->后置通知
} catch (RuntimeException e) {
//exceptionadvice()--> 例外通知
}finally{
//finallyadvice(); -->最终通知
}
}
return result;
}
}
使用是:
JDKProxyFactory factory = new JDKProxyFactory();
PersonService service = (PersonService) factory.createProxyIntance(new PersonServiceBean("xxx"));
service.save("888");
2。cglib可实现没有接口的类的代理:
package com.fsj.proxy;
import java.lang.reflect.Method;
import com.fsj.service.PersonService;
import net.sf.cglib.proxy.Enhancer;
import net.sf.cglib.proxy.MethodInterceptor;
import net.sf.cglib.proxy.MethodProxy;
public class CGLIBProxy implements MethodInterceptor{
private Object targetObject;
public Object createProxyInstance(Object targetObject)
{
this.targetObject = targetObject;
Enhancer enhancer = new Enhancer();//使用cglib的Enhancer
//将目标对象的类设置为enhancer的父类,
//那么enhancer会覆盖目标类中的所有非final的方法,在覆盖方法中加入一些自身的代码
enhancer.setSuperclass(this.targetObject.getClass());
//回调自身,前提是必须实现MethodInterceptor接口
enhancer.setCallback( this);//会回调intercept方法
//返回代理对象
return enhancer.create();
}
/**
* @param proxy 代理对象本身
* @param method 拦截到的方法
* @param args 方法的所有参数
* @param methodProxy 方法的代理对象
*/
@Override
public Object intercept(Object proxy, Method method, Object[] args,
MethodProxy methodProxy) throws Throwable {
//调用前处理------------advice()------前置通知
PersonService ps = (PersonService)this.targetObject;
Object result = null;
if(ps.getName()!=null)
{
try {
result = methodProxy.invoke(targetObject, args);
//调用后也可以处理------------afteradvice()--------后置通知
} catch (Exception e) {
//出错时处理------------exceptionadvice()---------例外通知
e.printStackTrace();
}finally
{
//出不出错都处理------------finallyadvice()--------最终通知
}
}
return result;
}
}
使用是:
PersonService ps = new PersonService();
// ps.setName("fs");
CGLIBProxy cglibProxy = new CGLIBProxy();
PersonService psProxy = (PersonService)cglibProxy.createProxyInstance(ps);
psProxy.add();
分享到:
相关推荐
本文将深入探讨两种主要的Java代理实现:JDK动态代理和CGLIB代理。 一、JDK动态代理 JDK动态代理基于接口实现,它要求被代理的类必须实现至少一个接口。在运行时,Java会动态地创建一个新的类,这个类实现了与原始...
- **CGLIB代理**适用于目标类没有接口或者不希望修改原有接口的情况,其性能通常优于JDK代理,因为它是基于字节码生成的子类,而JDK代理需要反射调用接口方法。 在实际开发中,如Spring AOP框架就同时支持JDK和...
本文主要介绍 Java 中两种常见的动态代理方式:JDK 原生动态代理和 CGLIB 动态代理。 一、 代理模式 代理模式是指程序通过代理类来访问目标对象,以达到对目标对象的控制和增强。代理模式的优点是可以在不改变目标...
然而,对于有接口的情况,JDK代理的创建速度更快。 - **复杂性**:JDK动态代理的API更简洁,易于理解和使用,而CGLIB需要更多的字节码操作知识。 总结起来,选择哪种代理方式取决于具体需求。如果目标对象实现了...
接下来将详细介绍三种常用的Java代理技术:JDK代理、CGLIB代理以及AspectJ代理,并对比它们各自的优缺点。 #### 二、静态代理实例 静态代理可以通过下面的例子进行说明: ```java public interface Calculator { ...
4. **对比与选择**:项目可能还会探讨在何时选择JDK动态代理和CGLIB。通常,如果目标对象实现了接口,首选JDK动态代理,因为它不需要额外的字节码生成;如果没有接口,或者性能要求较高,可以选择CGLIB。 在"Aop...
然而,由于涉及到字节码操作,CGLib在初始化阶段可能比JDK代理慢。 9. **使用示例**:创建一个动态代理通常涉及以下步骤: - 引入CGLib库。 - 创建Enhancer对象,并设置被代理的类以及回调对象。 - 通过Enhancer...
在Java中,我们可以使用两种主要的方式来实现动态代理:JDK动态代理和CGLIB动态代理。 1. **JDK动态代理**: - JDK动态代理基于接口实现,它要求被代理的目标对象必须实现至少一个接口。代理类会在运行时动态创建...
本示例"JDKProxy"着重于对比两种常见的动态代理技术:JDK的接口代理和CGLIB的类代理。这两种代理方式在Java应用程序中都有广泛的应用,例如在AOP(面向切面编程)框架如Spring中。 首先,我们来深入了解一下JDK的...
本篇文章将深入探讨代理模式的原理,特别是静态代理、JDK动态代理以及CGLIB动态代理。 1. **代理模式概述** 代理模式是设计模式中的结构型模式之一,它提供了一种方式来控制对目标对象的访问。代理对象可以看作是...
该思维导图主要讲解了代理模式的具体实现,包括jdk代理,cglib代理。其中jdk代理主要讲解了其具体的实现方式、原理...Cglib代理主要讲解了其原理、与JDK代理的对比、Enhancer源码解析、methodProxy和Fastclass源码等。
Spring AOP支持基于JDK Proxy和CGLIB的动态代理。 - **基于JDK Proxy的AOP**:当被代理的目标类实现了接口时,Spring会使用JDK Proxy来创建代理对象。 - **基于CGLIB的AOP**:当被代理的目标类没有实现接口时,...
动态代理主要有两种实现方式:JDK自带的`java.lang.reflect.Proxy`类和`java.lang.invoke.MethodHandle`API。这里主要讨论JDK的Proxy类,因为这是最常见且相对简单的实现方式。 1. **Proxy类的使用** - **Proxy....
#### 五、静态代理与动态代理对比 - **静态代理**:如案例中的`People1TimeProxy`类,它显式地实现了`Speak`接口,并在内部持有`People`对象的引用。这种方式较为僵化,每增加一个接口就需要新增一个代理类。 - **...
CGLIB生成的代理对象效率通常比JDK代理更高,但实现相对复杂。 通过上述内容,我们可以理解Java动态代理的基本原理和使用方法。对于初学者来说,通过练习和编写代码来实践这些概念是加深理解的最佳途径。提供的`...
java进阶源码分析专题常用设计模式线程与并发锁的使用深度理解synchronized、volatile、cas手写ASQSpring5IOC容器设计原理及高级特性AOP设计原理FactoryBean与BeanFactorySpring事务处理机制Spring JDK动态代理...
Spring AOP主要通过两种方式实现:JDK动态代理和CGLIB代理。 - **JDK动态代理**: - 当目标对象实现了至少一个接口时,Spring会使用JDK的java.lang.reflect.Proxy类创建一个代理对象。 - 代理对象在调用实际方法...
在Spring中,AOP通常通过动态代理实现,包括JDK动态代理和CGLIB。JDK动态代理基于接口,如果目标类实现了接口,则会生成代理类来拦截方法调用。而CGLIB则是在运行时生成目标类的子类,适用于未实现接口的类,但无法...
本套Java视频教程详细讲解了代理设计模式的用法。分别讲述了静态代理、JDK动态代理,及CGLIB动态代理的用法,及应用场景对比。此套Java视频教程适合Java初学者,为以后的学习打下坚实基础。