本文先举例子:后续跟进讲解内容,参考TOM老师
xiaoming是根据JDK媒婆代理找媳妇,要实现InvocationHandler接口
zhangsan时根据cglib媒婆代理找媳妇,无需实现接口
JDK代理如下:
package jdkProxy;
public interface Person {
public void findJob();
}
package jdkProxy;
/**
*小明找对象
*/
public class XiaoMing implements Person {
public void findJob(){
System.out.println("我叫小明,我找对象要求是白富美");
}
}
package jdkProxy;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
/**
* 媒婆代理,需要实现 InvocationHandler
*/
public class JDKMeiPo implements InvocationHandler
{
private XiaoMing target;
/**
* @param target
* @return 返回动态代理对象
* @throws Exception
*/
public Object getInstance(XiaoMing target) throws Exception{
this.target = target;
//创建一个动态代理对象,该动态代理实现了interfaces指定的系列接口,
// 执行动态代理对象的每个方法时都会被替换成执行InvocationHandler的对象的invoke方法
Object o = Proxy.newProxyInstance(target.getClass().getClassLoader(), target.getClass().getInterfaces(),this);
return o;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println("我是JDK媒婆,请说出你的需求。。。");
//反射执行方法
method.invoke(target,args);
System.out.println("现在开始物色");
return null;
}
}
package jdkProxy;
/**
* 动态代理的测试类
*/
public class MainTest {
public static void main(String[] args) throws Exception {
JDKMeiPo meiPo = new JDKMeiPo();
Person o = (Person)meiPo.getInstance(new XiaoMing());
o.findJob();
}
}
输出结果
我是JDK媒婆,请说出你的需求。。。
我叫小明,我找对象要求是白富美
现在开始物色
CGLIB代理如下:
package cglib;
public class Zhangsan {
public void findLove(){
System.out.println("我是张三,我的要求是钱钱钱要有钱");
}
}
package cglib;
import net.sf.cglib.proxy.Enhancer;
import net.sf.cglib.proxy.MethodInterceptor;
import net.sf.cglib.proxy.MethodProxy;
import java.lang.reflect.Method;
/**
* Cglib实现的媒婆
*/
public class CgLibMeiPo implements MethodInterceptor {
public Object getInstance(Class<?> clazz) throws Exception{
Enhancer enhancer = new Enhancer();
//设置代理目标
enhancer.setSuperclass(clazz);
//设置回调
enhancer.setCallback(this);
return enhancer.create();
}
@Override
public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {
//业务的增强
System.out.println("我是CGLIB媒婆,请说出你的需求。。。");
//反射执行方法
methodProxy.invokeSuper(o,objects);
System.out.println("现在开始物色");
return null;
}
}
package cglib;
public class TestCGLIB {
public static void main(String[] args) throws Exception {
Zhangsan zs = (Zhangsan)new CgLibMeiPo().getInstance(Zhangsan.class);
zs.findLove();
}
}
输出结果:
我是CGLIB媒婆,请说出你的需求。。。
我是张三,我的要求是钱钱钱要有钱
现在开始物色
jdk代理源码和手工实现代理需参考TOM老师的代理模式第二讲,后续跟进