jdk动态代理
目标对象
package com.study;
/**
* 目标对象(被代理的对象)
*
*/
public class Target implements TargetInf{
public String name;
public Target() {
}
public Target(String name) {
this.name = name;
}
public String buyCola (String name){
System.out.println("买了一瓶"+name+"可乐");
return "给你可乐";
}
public void byMilk(){
System.out.println("买牛奶");
}
}
代理对象
package com.study;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
public class JDKProxyUtil {
public static TargetInf getProxy(Target target){
/*
* ClassLoader loader,
Class<?>[] interfaces,
InvocationHandler h
*/
TargetInf o = (TargetInf)Proxy.newProxyInstance(JDKProxyUtil.class.getClassLoader(),
new Class[]{TargetInf.class},
new InvocationHandler() {
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println("before...");
Object o1 = method.invoke(target, args);
System.out.println("after...");
return o1;
}
});
return o;
}
}
测试方法
package com.study;
import java.lang.reflect.Proxy;
/**
* jdk动态代理
*/
public class Test {
public static void main(String[] args) {
TargetInf target = (TargetInf) JDKProxyUtil.getProxy(new Target("Tom"));
String 百事 = target.buyCola("百事");
System.out.println(百事);
target.byMilk();
}
}
jdk动态代理增强的对象必须要实现接口
CGLib动态代理
目标对象可以不实现接口,也可以实现接口
代理对象
package com.study;
import net.sf.cglib.proxy.Enhancer;
import net.sf.cglib.proxy.MethodInterceptor;
import net.sf.cglib.proxy.MethodProxy;
import java.lang.reflect.Method;
public class CGLibProxyUtil {
public static TargetInf getProxy(Target target){
Enhancer enhancer = new Enhancer();
enhancer.setSuperclass(TargetInf.class);
enhancer.setCallback(new MethodInterceptor() {
@Override
public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {
System.out.println("CGLIB Before...");
Object res = method.invoke(target, objects);
System.out.println("CGLIB After...");
return res;
}
});
TargetInf o = (TargetInf) enhancer.create();
return o;
}
}
测试代码
package com.study;
import java.lang.reflect.Proxy;
/**
* jdk动态代理
*/
public class Test {
public static void main(String[] args) {
Target target1 = new Target("Jerry");
TargetInf proxy = CGLibProxyUtil.getProxy(target1);
String kekou = proxy.buyCola("可口");
System.out.println(kekou);
proxy.byMilk();
}
}
本文含有隐藏内容,请 开通VIP 后查看