`
fulerbakesi
  • 浏览: 563993 次
文章分类
社区版块
存档分类
最新评论

The difference between Proxy and CGLIB

 
阅读更多

JAVA实现动态代理常用的有两种方式:

1, java.lang.reflect.Proxy (JDK)

2, net.sf.cglib.proxy.Enhancer(cglib)

两者之间的区别如图1-1 所示。

图1-1 jdk 和 cglib 概要图

jdk和cglib实现动态代理的原理是完全不同的,jdk是通过目标class所实现的接口,而cglib是通过目标对象的子类完成的。

他们二者互相补充,基本上能够满足所有的动态代理需求。


jdk和cglib实现动态代理的简单例子如下所示:


jdk:

****************************************************************************************************

1,定义接口

public interface SubInter {

public abstract void display() ;

public abstract void display2();

}


2, 定义实现类

public class SonObject implements SubInter {

@Override
public void display() {
System.out.println("This is a realy object !");
}

@Override
public void display2() {
System.out.println("This is a test2!");

}

}

3, 设置回调类

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;

public class Dynamic implements InvocationHandler {

private Object object;

private String validateString;

public Dynamic(Object object, String validateString) {
this.object = object;
this.validateString = validateString;
}

@Override
public Object invoke(Object arg0, Method arg1, Object[] arg2)
throws Throwable {
boolean b = validateMehod(arg1.getName());
Object object = null;
if (b) {
before();
object = arg1.invoke(this.object, arg2);
after();
}else {
object = arg1.invoke(this.object, arg2);
}
return object;
}

public boolean validateMehod(String methodName) {
boolean b = false;
String methodNames[] = validateString.split("&");
for (String name : methodNames) {
if (methodName.contains(name)) {
b = true;
return b;
}
}
return b;
}

public void before() {
System.out.println("Before");
}

public void after() {
System.out.println("after");
}

}

4, 动态代理工厂

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Proxy;

/**
*
* @author gyf
*
* We can get a proxy instance for the target object by the specify
* InvocationHandler.
*
*/
public class DynamicProxyFactory {

public static Object createProxyInstance(Object targetObject,
InvocationHandler handler) {
return Proxy.newProxyInstance(targetObject.getClass().getClassLoader(),
targetObject.getClass().getInterfaces(), handler);
}

}


5, 单元测试

public class Junit {

@Test
public void testJDK() {
SubInter targetObject = new SonObject();
InvocationHandler handler = new Dynamic(targetObject, "2&3");
SubInter object = (SubInter)DynamicProxyFactory.createProxyInstance(targetObject, handler);
object.display2();
}

}

cglib

*************************************************************************************************

1, 定义目标类

public class TargetObject {

public void display() {
System.out.println("This is a test");
}

public void display2() {
System.out.println("This is a test2");
}

}


2, 定义回调类

import java.lang.reflect.Method;

import net.sf.cglib.proxy.MethodInterceptor;
import net.sf.cglib.proxy.MethodProxy;

public class CglibDynamic implements MethodInterceptor{

private Object targetObject;

public CglibDynamic(){}

public CglibDynamic(Object object) {
this.targetObject = object;
}

@Override
public Object intercept(Object arg0, Method arg1, Object[] arg2,
MethodProxy arg3) throws Throwable {

Object object = arg3.invoke(targetObject, arg2);

return object;
}

}

3, 定义动态代理工厂

import net.sf.cglib.proxy.Enhancer;
import net.sf.cglib.proxy.MethodInterceptor;

public class CglibDynamicFactory {

public static Object getProxyInstance(Object targetObject,
MethodInterceptor methodInterceptor) {

Enhancer enhancer = new Enhancer();
enhancer.setSuperclass(targetObject.getClass());
enhancer.setCallback(methodInterceptor);

return enhancer.create();
}

}


4, 单元测试

import net.sf.cglib.proxy.MethodInterceptor;

import org.junit.Test;

import com.cglib.proxy.CglibDynamic;
import com.cglib.proxy.CglibDynamicFactory;
import com.cglib.proxy.TargetObject;

public class Junit {

@Test
public void testCglib() {
TargetObject object = new TargetObject();
MethodInterceptor interceptor = new CglibDynamic(object);

TargetObject son = (TargetObject)CglibDynamicFactory.getProxyInstance(object, interceptor);
son.display();
}

}


当然Hibernate现在采用了javasist来取代cglib, 有关javasist我会继续学习。



分享到:
评论

相关推荐

    Spring如何基于Proxy及cglib实现动态代理

    主要介绍了Spring如何基于Proxy及cglib实现动态代理,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下

    Java动态代理Proxy和cglib

    NULL 博文链接:https://softwarexiang120.iteye.com/blog/2277356

    cglib aop spring 动态代理

    静态代理--不适合企业开发,适合初学者理解代理。... 3.cglib用于AOP,jdk中的proxy必须基于接口,cglib却没有这个限制。 spring 的AOP功能中 会根据目标类是否实现了接口来判断使用 jdk Proxy还是cglib

    java CGLIB动态代理代理支持包。

    在java编程使用CGLIB做动态代理时需要CGLIB依赖包支持,没有这个支持包,当导入import net.sf.cglib.proxy.Enhancer;或者import net.sf.cglib.proxy.MethodProxy;类似包时会提示错误,所以分享出来同大家共勉。

    cglib-nodep

    Add CGLIB to the class path or specify proxy interfaces 从异常信息可以看出是cglib的问题,而我们去检查项目,却发现项目中并未cglib的jar,那么你可能想到的是缺少cglib这个jar包,没错,你的思路是正确的,你...

    The interactive HTTP proxy WebScarab – Installation.pdf

    The interactive HTTP proxy WebScarab – Installation.pdf

    使用JDK中的Proxy技术实现AOP功能与使用CGLIB实现AOP功能

    使用JDK中的Proxy技术实现AOP功能与使用CGLIB实现AOP功能

    The C++ TCP Proxy server

    C++ TCP Proxy server 是一个简单的基于 ASIO 网络包的简单工具,用于代理外部客户端连接到指定的服务器,使用简单而且高效: 支持连接数限制 支持客户端到多服务器的负载均衡 提供基于IP和连接时间的过滤和访问...

    CgLib2.2 API

    CgLib2.2 API cglib Packages net.sf.cglib.beans net.sf.cglib.core net.sf.cglib.proxy net.sf.cglib.reflect net.sf.cglib.transform net.sf.cglib.transform.impl net.sf.cglib.util

    Proxy Pattern Informatization Research Based On SaaS

    As one important part of the informatization platform, the proxy service center carries on the product logistics between suppliers and franchisees. The realization of proxy pattern informatization may...

    cglib.jar源码

    spring AOP中的cglib代理所依赖的jar包cglib.jar源码 net.sf.cglib.proxy

    de4dot Mod TheProxy

    de4dot Mod by TheProxy: - Manco.Net - Yano - NETPack - NetZ

    cglib-full.jar

    使用CGLib库需要导入的Jar包,官网下载,亲测可用! cglib - Byte Code Generation Library ... It is used by AOP, testing, data access frameworks to generate dynamic proxy objects and intercept field access.

    f5 BIGIP V9 Full Proxy定义_WhatdoesFullProxyMean

    The line of what is and isn’t a proxy are being blurred. We need to clarify these differences and possibly change our positioning if we can’t put enough wood behind it. In its simplest form, a ...

    网络安全与防火墙_英文文献翻译

    As the key facility that maintains the network security , firewalls take the purpose of establishing an obstacle between trust and trustless network, and put corresponding safety strategy into ...

    spedye: A reverse proxy for the HTTPS and SPDY protocols

    spedye: A reverse proxy for the HTTPS and SPDY protocols

    cglib-nodep-2.1_3.jar

    使用cglib动态代理需要的jar包, net.sf.cglib.proxy.MethodInterceptor;

    WinHTTP Web Proxy Auto-Discovery Service 服务处于停止状态

    WinHTTP Web Proxy Auto-Discovery Service 服务处于 停止 状态还有,我的服务器没有使用WEB代理和防火墙客户端。

    foxyproxy_standard

    FoxyProxy 是一款高级代理服务器管理工具,是 Firefox 火狐浏览器的代理插件,相比比 SwitchProxy、ProxyButton、QuickProxy、xyzproxy、ProxyTex 等扩展提供更多的功能。 FoxyProxy 通过使用通配符、正则表达式和...

Global site tag (gtag.js) - Google Analytics