1.概述
JDK动态代理:只能代理实现了接口的类,代理对象是实现了目标对象所有接口的代理类
使用java.lang.reflect.Proxy
类和java.lang.reflect.InvocationHandler
接口来创建代理对象,工作通过反射机制完成。
2.实现接口InvocationHandler
/**
* * 1. jdk动态代理,要求必须有接口,最终生成的代理类和目标类实现相同的接口,
* 在com.sun.proxy包下,类名为$proxy+数字 (例如:$proxy6)
*/
public class MyInvocationHandler implements InvocationHandler {
private Object target;
public MyInvocationHandler(Object target) {
super();
this.target = target;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println("[JDK动态代理]--方法:"+method.getName()+",参数:"+ Arrays.toString(args));
this.tuoKuzi();
Object result = method.invoke(target, args);
this.chuanKuzi();
System.out.println("[JDK动态代理]--方法:"+method.getName()+",结 果:"+ result);
return result;
}
/**
* 生成代理类
* 第二个参数interfaces 所以必须要继承一个接口
*/
public Object creatProxyedObj()
{
/**
* ClassLoader 获取代理对象的类加载器
* Class<?>[] interfaces:被代理对象实现的所有接口数组
* 当通过代理类的对象发起对被重写的方法的调用时,都会转换为invoke方法的调用
*/
return Proxy.newProxyInstance(target.getClass().getClassLoader(), target.getClass().getInterfaces(), this);
}
private void chuanKuzi() {
System.out.println("后置:大威德3秒就结束了,提起裤子");
}
private void tuoKuzi() {
System.out.println("前置:大威德脱裤子,带上冈本");
}
}
3.被代理的类以及接口
public interface IKaifangService {
int yuehui(String name);
}
public class KaifangServiceImpl implements IKaifangService {
@Override
public int yuehui(String name){
System.out.println("何由一相见,灭烛解罗衣---" + name);
return 1;
}
}
4.测试类
public class JdkTest {
public static void main(String[] args) {
IKaifangService kaifangService = new KaifangServiceImpl();
MyInvocationHandler myInvocationHandler = new MyInvocationHandler(kaifangService);
IKaifangService proxy = (IKaifangService) myInvocationHandler.creatProxyedObj();
//人间中毒女主角
proxy.yuehui("林智妍");
}
}
5.结果