JDK动态代理是利用反射机制生成一个实现代理接口的匿名类,在调用具体方法前调用InvokeHandler来处理。
STEP: 1 发送短信的接口
package Demo001;
/**
* @Auther: 凯
* @Date: 2021/05/17/16:30
* @Description: 发送短信的接口
*/
public interface SmsService {
String send(String message);
}
STEP:2 实现发送短信的接口
public class SmsServiceImpl implements SmsService{
public String send(String message) {
System.out.println("send message:" + message);
return message;
}
}
STEP:3 定义一个JDK动态代理
public class DebugInvocationHandler implements InvocationHandler {
private final Object target;
public DebugInvocationHandler(Object target) {
this.target = target;
}
public Object invoke(Object proxy, Method method,Object[] args) throws InvocationTargetException,IllegalAccessException {
System.out.println("before method " + method.getName());
Object result = method.invoke(target,args);
System.out.println("after method " + method.getName());
return result;
}
}
STEP:4 获取代理对象的工厂类
public class JdkProxyFactory {
public static Object getProxy(Object target) {
return Proxy.newProxyInstance(
target.getClass().getClassLoader(),
target.getClass().getInterfaces(),
new DebugInvocationHandler(target)
);
}
}
Demon演示:
public class Demo {
public static void main(String[] args) {
JdkProxyFactory jdkProxyFactory = new JdkProxyFactory();
SmsService smsService = (SmsService) JdkProxyFactory.getProxy(new SmsServiceImpl());
smsService.send("代理成功!");
System.out.println(jdkProxyFactory.getClass());
//Proxy.newProxyInstance()
// -------->getProxyClass0()
// ------->ProxyClassFactory.apply()
// -------->ProxyGenerator.generateProxyClass()
}
}