Java动态代理机制是一种强大的编译时生成代码的机制。
比如以下例子,其实就是在编译后生成一个HelloImpl的代理类。它要求被代理的方法必须来自于一个借口,如例子中的Hello
package org.mark.proxy;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
public class TestDynamicProxy {
public static interface Hello {
public void sayHello();
}
public static class HelloImpl implements Hello {
@Override
public void sayHello() {
// TODO Auto-generated method stub
System.out.println("say hello");
}
}
public static class ProxyTest implements InvocationHandler {
Object originalObj;
Object bind(Object originalObj) {
this.originalObj = originalObj;
return Proxy.newProxyInstance(originalObj.getClass().getClassLoader(), originalObj.getClass().getInterfaces(), this);
}
@Override
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
System.out.println("DynamicProxy invocated!");
return method.invoke(originalObj, args);
}
}
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
Hello hello = (Hello) new ProxyTest().bind(new HelloImpl());
hello.sayHello();
}
}
那么问题来了,挖掘机技术哪家强?
如果说一个普通的类,有一个方法,该方法并非实现接口所得,那么它的动态代理应该怎么做呢?首先Java的JDK内置动态代理无法做到,因为它要求代理的方法必须来自于借口,所以可以用CGLib来做此类的代理行为。CGLIB具有简单易用,它的运行速度要远远快于JDK的Proxy动态代理。
如下例子程序
package org.mark.proxy;
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 TestCGLib {
public static class InfoManager {
public void create() {
System.out.println("Create a record");
}
}
public static class InfoManagerFactory {
public static InfoManager getInstance(CGLibProxy proxy) {
Enhancer enhancer = new Enhancer();
enhancer.setSuperclass(InfoManager.class);
enhancer.setCallback(proxy);
return (InfoManager)enhancer.create();
}
}
public static class CGLibProxy implements MethodInterceptor {
private String name;
public CGLibProxy(String name) {
this.name = name;
}
@Override
public Object intercept(Object arg0, Method arg1, Object[] arg2,
MethodProxy arg3) throws Throwable {
if(!name.equals("Test")) {
System.out.println("Name is not Test, cglib ignored");
return null;
}
System.out.println("cglib proxy called");
return arg3.invokeSuper(arg0, arg2);
}
}
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
InfoManager manager = InfoManagerFactory.getInstance(new CGLibProxy("Test"));
manager.create();
InfoManager manager2 = InfoManagerFactory.getInstance(new CGLibProxy("Test2"));
manager2.create();
}
}
分享到:
相关推荐
java代理机制 JDK动态代理和cglib代理 详解
java动态代理和cglib动态代理示例分享共5页.pdf.zip
jdk 和 cglib的简单动态代理,闲来无事 写写。有需要的朋友可以看看
JAVA动态代理实现Demo(JDK动态代理和CGLIB动态代理)
实现java动态代理的两个实例,jdk动态代理和cglib
NULL 博文链接:https://pluto418.iteye.com/blog/1692218
Java 动态代理详解(代理模式+静态代理+JDK动态代理+CGLIB动态代理)
Java JDK代理、CGLIB、AspectJ代理分析比较
java静态代理 jdk动态代理 cglib动态代理 代理原理
JAVA JDK静态代理、动态代理、CGlib代理的代码演示 为对象增加功能
CGLIB是一个强大的、高性能的代码生成库。它被广泛使用在基于代理的AOP框架(例如Spring AOP和...EasyMock和jMock作为流行的Java测试库,它们提供Mock对象的方式来支持测试,都使用了CGLIB来对没有接口的类进行代理。
java动态代理(JDK和cglib).pdfjava动态代理(JDK和cglib).pdfjava动态代理(JDK和cglib).pdfjava动态代理(JDK和cglib).pdfjava动态代理(JDK和cglib).pdf
附件为java 动态代理实例,有全码,包括测试代码。 代码少,注释全。 对理解代理非常不错。
java动态代理(JDK和cglib)共10页.pdf.zip
Java的动态代理,包括JDK自带的和cglib所集成的。
在java编程使用CGLIB做动态代理时需要CGLIB依赖包支持,没有这个支持包,当导入import net.sf.cglib.proxy.Enhancer;或者import net.sf.cglib.proxy.MethodProxy;类似包时会提示错误,所以分享出来同大家共勉。
java常用设计模式及JDK与CGLIB实现动态代理区别(源码) /** * 使用cglib动态代理 * @author * */ public class BookFacadeProxy implements MethodInterceptor{ private Object target; @Override public...
cglib和asm搭配的jar,方便你使用动态代理
Cglib动态代理技术对目标对象有没有实现接口,没有要求. Cglib动态代理技术,是通过拷贝然后修改目标对象的类的字节码来产生一个代理对象 而且这个Cglib产生的代理对象实例 是 目标对象的一个子类.
java动态代理(JDK和cglib)共10页.pdf.zip