实现简单的动态代理工厂

今天重新梳理了动态代理。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();
}
}


执行结果:
[color=green]This is before, build transaction!
Message is here!
This is after, commit transaction!
Transaction start----
NoInterface Message!
Transaction commit-----
[/color]
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值