JDK动态代理
1 新建一个接口
public interface Person {
public void findJob();
public void findFriend();
}
2 为接口创建一个实现类
public class Bobby implements Person {
@Override
public void findJob() {
System.out.println("Make fifty some dollars a day");
}
@Override
public void findFriend() {
System.out.println("I want BBW");
}
}
3 创建代理类实现java.lang.reflect.InvocationHandler接口
public class JDKMeipo implements InvocationHandler {
// 目标对象 jdk动态代理针对接口
private Person target;
public Object getInstance(Person target) {
this.target = target;
Class<? extends Person> targetClass = target.getClass();
Object o = Proxy.newProxyInstance(targetClass.getClassLoader(), targetClass.getInterfaces(), this);
return o;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println("jdk代理启动------------");
method.invoke(this.target,args);
System.out.println("jdk代理结束-----------");
return null;
}
}
4 测试
public class JDKMeipoTest {
public static void main(String[] args) {
Person instance = (Person)new JDKMeipo().getInstance(new Bobby());
instance.findFriend();
}
}
Cglib代理
1 实现一个业务类,注意,这个业务类并没有实现任何接口(这边顺便验证了下如果有返回参数怎么做到)
public class XiaoMing {
public Object findFriend(String name) {
return name;
}
}
2 一个代理类实现 MethodInterceptor 接口
public class CglibProxy implements MethodInterceptor {
public Object getInstance(Class<?> clazz) {
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("CglibProxy start -------------");
//ret 为方法执行的返回值
Object ret = methodProxy.invokeSuper(o, objects);
System.out.println("CglibProxy end -------------");
return ret;
}
}
3 测试
public class CglibProxyTest {
public static void main(String[] args) {
XiaoMing instance = (XiaoMing)new CglibProxy().getInstance(XiaoMing.class);
String bobby = (String)instance.findFriend("Bobby");
System.out.println(bobby);
}
}