java提供的基于Proxy、InvocationHandler的动态代理由于只能创建接口的代理对象,在实际应用中不能很好的满足需要,针对这个问题,另外一个开源框架cglib提供了一种实现方式,可以针对类进行代理对象的创建。
cglib官方网站:http://sourceforge.net/projects/cglib/files/
另外cglib依赖于asm(http://asm.ow2.org/)。
cglib使用示例:
HelloWorld.java
- public class HelloWorld{
-
- public String sayHello(String name){
- System.out.println("执行sayHello()");
- return "hello,"+name;
- }
- }
public class HelloWorld{
public String sayHello(String name){
System.out.println("执行sayHello()");
return "hello,"+name;
}
}
拦截器MyMethodInterceptor.java
- import java.lang.reflect.Method;
- import net.sf.cglib.proxy.MethodInterceptor;
- import net.sf.cglib.proxy.MethodProxy;
-
- public class MyMethodInterceptor implements MethodInterceptor{
-
-
-
-
-
-
-
- public Object intercept(Object obj, Method method, Object[] args, MethodProxy proxy) throws Throwable {
-
- System.out.println("执行方法"+method+"前");
-
-
- Object returnValue = proxy.invokeSuper(obj, args);
-
- System.out.println("执行方法"+method+"后");
-
- return returnValue;
- }
-
- }
import java.lang.reflect.Method;
import net.sf.cglib.proxy.MethodInterceptor;
import net.sf.cglib.proxy.MethodProxy;
public class MyMethodInterceptor implements MethodInterceptor{
/*
* obj 代理对象实例
* method 源对象的方法名
* args 传递给方法的实际入参
* proxyMethod 与源对象中的method相对应的代理对象中的方法
*/
public Object intercept(Object obj, Method method, Object[] args, MethodProxy proxy) throws Throwable {
System.out.println("执行方法"+method+"前");
//执行源对象的method方法
Object returnValue = proxy.invokeSuper(obj, args);
System.out.println("执行方法"+method+"后");
return returnValue;
}
}
代理工厂ProxyFactory.java
- import net.sf.cglib.proxy.Enhancer;
-
-
- public class ProxyFactory {
-
-
-
-
- public static Object getProxyObj(String clazz) throws Exception{
-
- Class<?> superClass = Class.forName(clazz);
-
- Enhancer hancer = new Enhancer();
-
-
- hancer.setSuperclass(superClass);
-
-
- hancer.setCallback(new MyMethodInterceptor());
-
-
- return hancer.create();
- }
- }
import net.sf.cglib.proxy.Enhancer;
public class ProxyFactory {
/*
* 获得代理对象
*/
public static Object getProxyObj(String clazz) throws Exception{
Class<?> superClass = Class.forName(clazz);
Enhancer hancer = new Enhancer();
//设置代理对象的父类
hancer.setSuperclass(superClass);
//设置回调对象,即调用代理对象里面的方法时,实际上执行的是回调对象(里的intercept方法)。
hancer.setCallback(new MyMethodInterceptor());
//创建代理对象
return hancer.create();
}
}
测试类:
- public class Test {
-
- public static void main(String[] args) {
-
- try {
- HelloWorld hello = (HelloWorld) ProxyFactory.getProxyObj(HelloWorld.class.getName());
- System.out.println(hello.sayHello("huangqiqing"));
- } catch (Exception e) {
- e.printStackTrace();
- }
- }
- }
public class Test {
public static void main(String[] args) {
try {
HelloWorld hello = (HelloWorld) ProxyFactory.getProxyObj(HelloWorld.class.getName());
System.out.println(hello.sayHello("huangqiqing"));
} catch (Exception e) {
e.printStackTrace();
}
}
}
输出结果:
执行方法public java.lang.String HelloWorld.sayHello(java.lang.String)前
执行sayHello()
执行方法public java.lang.String HelloWorld.sayHello(java.lang.String)后
hello,huangqiqing
执行方法protected void java.lang.Object.finalize() throws java.lang.Throwable前
执行方法protected void java.lang.Object.finalize() throws java.lang.Throwable后
分享到:
相关推荐
三、CGLIB的应用 广泛的被许多AOP的框架使用,例如Spring AOP和dynaop。Hibernate使用CGLIB来代理单端single-ended(多对一和一对一)关联。 四、CGLIB的API 1、Jar包: cglib-nodep-2.2.jar:使用nodep包不需要...
CGLIB,全称为Code Generation Library,是一个强大的高性能的代码生成库,它在Java世界里被广泛应用,尤其是在Spring框架中。CGLIB是基于ASM(一个底层的Java字节码操作和分析框架)来实现的,它允许开发者在运行时...
CGLIB,全称为Code Generation Library,是一个强大的高性能的代码生成库,被广泛应用于Java世界,尤其是Spring框架中。它允许程序在运行时动态地创建Java对象并扩展已有类的功能。CGLIB是通过字节码技术实现的,而...
总结来说,CGlib是一个强大且灵活的Java代码生成库,它简化了字节码操作,为开发人员提供了动态创建类和方法的能力,尤其在实现动态代理和AOP场景中有着广泛的应用。理解并掌握CGlib的使用,对于提升Java开发效率和...
CGLib,全称为Code Generation Library,是一个强大的高性能的代码生成库,它在Java世界中被广泛应用,尤其是在动态代理和AOP(面向切面编程)领域。这个库的主要功能是能够在运行时动态创建类或者增强已有类的功能...
Cglib是一个强大的、高性能的代码生成库,它在Java世界中被广泛应用,尤其是在动态代理和AOP(面向切面编程)领域。Cglib3.3.0是该库的最新版本,提供了两个jar包:`cglib-3.3.0.jar`和`cglib-nodep-3.3.0.jar`。 1...
在实际应用中,理解CGLib的工作原理和如何正确使用回调是非常重要的。这不仅有助于提升代码的灵活性和可维护性,还能有效地利用AOP来解决复杂的问题,例如日志记录、性能分析、权限控制等。 由于CGLib是基于字节码...
总的来说,CGLib作为一个强大的字节码生成库,广泛应用于AOP(面向切面编程)、ORM框架(如Hibernate)、测试工具(如Mockito)等领域,提供了对Java类的灵活扩展和控制。正确理解和使用CGLib,能极大地提升开发效率...
总的来说,CGLIB是一个强大的工具,它允许开发者在运行时动态地生成和修改类,极大地扩展了Java的应用能力。对于那些需要高性能和低侵入性的代理解决方案的项目,CGLIB是一个值得考虑的选择。同时,理解如何正确使用...
CGLib,全称为Code Generation Library,是一个强大的高性能的代码生成库,它在Java世界中被广泛应用,尤其是在动态代理和AOP(面向切面编程)领域。CGLIB是由Evan Schoolnik开发并维护的,它最初是作为Jakarta OGNL...
CGLib,全称为Code Generation Library,是一个强大的Java字节码操作库,广泛应用于动态代理、AOP(面向切面编程)以及性能优化等领域。它允许开发者在运行时创建和增强新的类或对象,而无需编写任何Java源代码。...
其中,`cglib.jar` 和 `asm.jar` 是实现Java动态代理的两个关键库,它们在许多框架和库中都有广泛的应用,比如Spring AOP和Hibernate。 `cglib.jar` 是一个强大的代码生成库,全称为Code Generation Library。它...
在实际开发中,CGLIB主要应用在以下几个方面: - **AOP(面向切面编程)**:在Spring框架中,CGLIB被用于创建代理对象,实现方法拦截,从而实现切面逻辑,如事务管理、日志记录等。 - **ORM(对象关系映射)**:在...
它被广泛应用于许多框架中,例如Spring AOP(面向切面编程)和Hibernate ORM(对象关系映射)。CGlib允许开发者在运行时动态创建子类,从而实现对现有类的增强或代理功能。这个"cglib所有jar包"很可能是包含CGlib库...
CGlib,全称为Code Generation Library,是一个强大的高性能的代码生成库,它被广泛应用于Java世界,主要用于动态代理、AOP(面向切面编程)以及优化等场景。在Java开发中,如果你需要用到动态代理或者需要在运行时...
Cglib在许多领域都有应用,包括日志、性能监控、事务管理等。由于其高效性和灵活性,它已成为Java开发中的重要工具,特别是在需要动态代理的场景下。不过,Cglib也有其局限性,如无法处理final类和方法,以及对Java ...
CGLIB(Code Generation Library)是一个强大的高性能的代码生成库,它被广泛应用于Java世界中的动态代理和字节码操作。CGLIB是基于ASM库来实现的,ASM是一个底层的Java字节码操控和分析框架,它可以用来动态生成类...