之前有写过一个JDK的动态代理,但是却局限于接口实现,也就是说代理目标类必须要有一个接口。
加入需要被代理的类没有提供接口的话,是不可以使用JDK动态代理的。
那么使用CGLIB的话,目标类就有自己的接口去实现。
它可以生成目标类的子类,并且重写父类的非Final修饰的方法。
可以再Spring的lib里找到cglib的jar包
还是写一个小例子:
一个代理目标类:
package com.jzkangta.demo;
public class PersonService {
public void savePerson() {
// TODO Auto-generated method stub
System.out.println("添加用户了........");
}
}
一个生成代理对象的Factory:
package com.jzkangta.demo;
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 ProxyFactory implements MethodInterceptor{
private Object targetObject; // 需要代理的目标对象
//创建代理对象 也可以用构造方法来做
public Object createProxyIntance(Object targetObject) {
this.targetObject = targetObject;
Enhancer enhancer = new Enhancer();//使用Enhancer来创建代理对象
enhancer.setSuperclass(this.targetObject.getClass());//需要把代理目标类设置为Enhancer的父类,这就是说这个生成的代理类继承了代理目标类
enhancer.setCallback(this);//这个this参数和之前JDK动态代理里newProxyInstance的第三个参数一样,是个回调方法
return enhancer.create();
}
public void testFunction(){
System.out.println("执行额外的功能方法.........");
}
@Override
public Object intercept(Object arg0, Method method, Object[] arg2,
MethodProxy arg3) throws Throwable {
testFunction();
//此处可以加逻辑判断,只有正确才执行method.invoke方法
Object result = method.invoke(targetObject, arg2); //这里是指需要调用目标代理对象的最终方法
return result;
}
}
一个客户端调用方法:
package com.jzkangta.demo;
public class Test {
public static void main(String[] args) {
ProxyFactory proxyFactory = new ProxyFactory();
//注意,这里的personService不再是一个接口了
PersonService personService = (PersonService)proxyFactory.createProxyIntance(new PersonService());
personService.savePerson();
}
}
分享到:
相关推荐
java代理机制 JDK动态代理和cglib代理 详解
java静态代理 jdk动态代理 cglib动态代理 代理原理
java动态代理和cglib动态代理示例分享共5页.pdf.zip
JAVA动态代理实现Demo(JDK动态代理和CGLIB动态代理)
CGLIB是一个强大的、高性能的代码生成库。它被广泛使用在基于代理的AOP框架(例如Spring AOP和...EasyMock和jMock作为流行的Java测试库,它们提供Mock对象的方式来支持测试,都使用了CGLIB来对没有接口的类进行代理。
Java 动态代理详解(代理模式+静态代理+JDK动态代理+CGLIB动态代理)
Cglib动态代理技术对目标对象有没有实现接口,没有要求. Cglib动态代理技术,是通过拷贝然后修改目标对象的类的字节码来产生一个代理对象 而且这个Cglib产生的代理对象实例 是 目标对象的一个子类.
jdk 和 cglib的简单动态代理,闲来无事 写写。有需要的朋友可以看看
Java JDK代理、CGLIB、AspectJ代理分析比较
在java编程使用CGLIB做动态代理时需要CGLIB依赖包支持,没有这个支持包,当导入import net.sf.cglib.proxy.Enhancer;或者import net.sf.cglib.proxy.MethodProxy;类似包时会提示错误,所以分享出来同大家共勉。
JAVA JDK静态代理、动态代理、CGlib代理的代码演示 为对象增加功能
java常用设计模式及JDK与CGLIB实现动态代理区别(源码) /** * 使用cglib动态代理 * @author * */ public class BookFacadeProxy implements MethodInterceptor{ private Object target; @Override public...
实现java动态代理的两个实例,jdk动态代理和cglib
NULL 博文链接:https://pluto418.iteye.com/blog/1692218
java设计模式【之】Cglib动态代理【源码】【场景:帮爸爸买菜】 /** * 代理模式 * 在开发者的角度来看,创建一个代理对象,提供给用户使用,避免用户直接访问真正的对象 * 在用户角度来看,就是普通的类方法调用...
cglib和asm搭配的jar,方便你使用动态代理
cglib动态代理相关jar包,亲测可用cglib动态代理相关jar包,亲测可用cglib动态代理相关jar包,亲测可用
基于MAVEN项目的CGLib动态代理原理及实现
Java的动态代理,包括JDK自带的和cglib所集成的。
CGlib动态代理类jar包,一共两个jar包,模拟CGlib动态代理用得到。