转载另外一个博主,博主代码没有格式化,所以重新贴一下。
public class JDKProxyFactory<T> implements InvocationHandler {
/**
* 要代理的真实对象
*/
private T target;
/**
* 构造方法
* @param target
*/
public JDKProxyFactory(T target) {
this.target = target;
}
/**
* 获取代理对象
* @return
*/
public T getProxy(){
return (T) Proxy.newProxyInstance(target.getClass().getClassLoader(), target.getClass().getInterfaces(), this);
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
/*方法增强*/
System.out.println("大家好!!");
Object result = method.invoke(target, args);
/*方法增强*/
System.out.println("再见!!!");
return result;
}
}
public class CgLibProxyFactory<T> implements MethodInterceptor {
/**
* 获取代理对象
* @param clazz 需要被代理的目标对象
* @return 代理对象
*/
public T getProxyByCgLib(Class<T> clazz){
/*创建增强器*/
Enhancer enhancer = new Enhancer();
/*设置需要增强的类的类对象*/
enhancer.setSuperclass(clazz);
/*设置回调函数*/
enhancer.setCallback(this);
/*获取增强之后的代理对象*/
return (T)enhancer.create();
}
/**
* 代理对象的回调
* @param o 代理对象,也就是"目标对象" 的子类
* @param method 目标对象 的 方法
* @param objects 参数
* @param methodProxy 代理对象的方法
* @return 返回结果 返回给调用者
* @throws Throwable
*/
@Override
public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {
System.out.println("cglib ==> 大家好");
Object result = methodProxy.invokeSuper(o, objects);
System.out.println("cglib ==> 再见");
return result;
}
}
@Test
public void testCgLibProxy(){
/*创建实例*/
PersonalImpl personal = new PersonalImpl();
/*获取代理类*/
CgLibProxyFactory<PersonalImpl> factory = new CgLibProxyFactory<PersonalImpl>();
PersonalImpl proxy = factory.getProxyByCgLib((Class<PersonalImpl>) personal.getClass());
generatorClass(proxy);
proxy.introduction();
}
@Test
public void testProxy(){
/*创建实例*/
Personal personal = new PersonalImpl();
/*创建代理对象*/
JDKProxyFactory<Personal> factory = new JDKProxyFactory<Personal>(personal);
Personal proxy = factory.getProxy();
generatorClass(proxy);
proxy.introduction();
}