今天重新梳理了动态代理。JDK和Cglib。Cglib对象的生成速度比JDK慢,但是执行速度比JDK快。另外最大不同JDK只支持实现接口的类的生成代理,Cglib是生成子类来实现,不要求目标类实现了接口。
看看代码吧。
未实现接口的类:
JDK方式生成代理类:
----------下面是接口和接口的实现类,以及接口实现类的代理类
接口:
接口实现类:
Cglib方式生成代理类:
------下面是代理工厂类,根据传入对象是否实现了接口来判断是使用JDK还是Cglib来创建代理类。
--------main方法调用
执行结果:
[color=green]This is before, build transaction!
Message is here!
This is after, commit transaction!
Transaction start----
NoInterface Message!
Transaction commit-----
[/color]
看看代码吧。
未实现接口的类:
package com.zjs.service.impl;
public class NoInterfaceService {
public void printMessage(){
System.out.println("NoInterface Message!");
}
}
JDK方式生成代理类:
package com.zjs.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 CglibProxyWorker implements MethodInterceptor {
public Object enhanceProxy(Object object){
Enhancer enhancer = new Enhancer();
enhancer.setSuperclass(object.getClass());
//callback
enhancer.setCallback(this);
return enhancer.create();
}
@Override
public Object intercept(Object obj, Method method, Object[] args,
MethodProxy proxy) throws Throwable {
System.out.println("Transaction start----");
proxy.invokeSuper(obj, args);
System.out.println("Transaction commit-----");
return null;
}
}
----------下面是接口和接口的实现类,以及接口实现类的代理类
接口:
package com.zjs.service;
public interface WorkerService {
public void giveMessage();
}
接口实现类:
package com.zjs.service.impl;
import com.zjs.service.WorkerService;
public class WorkerServiceImpl implements WorkerService {
@Override
public void giveMessage() {
System.out.println("Message is here!");
}
}
Cglib方式生成代理类:
package com.zjs.proxy;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
public class ProxyWorker implements InvocationHandler {
private Object target;
public Object bind(Object target){
this.target = target;
return Proxy.newProxyInstance(target.getClass().getClassLoader(), target.getClass().getInterfaces(), this);
}
@Override
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
Object result = null;
System.out.println("This is before, build transaction!");
result = method.invoke(target, args);
System.out.println("This is after, commit transaction!");
return result;
}
}
------下面是代理工厂类,根据传入对象是否实现了接口来判断是使用JDK还是Cglib来创建代理类。
package com.zjs.proxy;
public class ProxyFactory {
private static final ProxyWorker proxyWorker = new ProxyWorker();
private static final CglibProxyWorker cglibProxyWorker = new CglibProxyWorker();
public static Object getProxyInstance(Class<?> clazz) throws InstantiationException, IllegalAccessException {
Object object = clazz.newInstance();
Class<?>[] interfaceClazz = object.getClass().getInterfaces();
if(interfaceClazz!=null && interfaceClazz.length>0){//If the object implemented interface
return proxyWorker.bind(object);
}else{
return cglibProxyWorker.enhanceProxy(object);
}
}
}
--------main方法调用
package com.zjs;
import com.zjs.proxy.ProxyFactory;
import com.zjs.service.WorkerService;
import com.zjs.service.impl.NoInterfaceService;
import com.zjs.service.impl.WorkerServiceImpl;
public class MainClass {
public static void main(String[] args) throws InstantiationException, IllegalAccessException {
WorkerService proxyService = (WorkerService)ProxyFactory.getProxyInstance(WorkerServiceImpl.class);
proxyService.giveMessage();
NoInterfaceService proxyNfs = (NoInterfaceService)ProxyFactory.getProxyInstance(NoInterfaceService.class);
proxyNfs.printMessage();
}
}
执行结果:
[color=green]This is before, build transaction!
Message is here!
This is after, commit transaction!
Transaction start----
NoInterface Message!
Transaction commit-----
[/color]