实现简单的动态代理工厂

今天重新梳理了动态代理。JDK和Cglib。Cglib对象的生成速度比JDK慢,但是执行速度比JDK快。另外最大不同JDK只支持实现接口的类的生成代理,Cglib是生成子类来实现,不要求目标类实现了接口。
看看代码吧。
未实现接口的类:
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();
	}
}


执行结果:
This is before, build transaction!
Message is here!
This is after, commit transaction!
Transaction start----
NoInterface Message!
Transaction commit-----

你可能感兴趣的:(动态代理 Cglib)