1、jdk动态代理代码实现
1、接口
java">public interface IUserService {
void save();
void delete();
}
2、接口实现
java">@Service
public class UserServiceImpl implements IUserService {
@Override
public void save() {
System.out.println("UserServiceImpl.save");
}
@Override
public void delete() {
System.out.println("UserServiceImpl.delete");
}
}
3、代理类创建
java">@Test
public void testJdkProxy(){
//使用jdk动态代理生成 代理对象
IUserService userServiceProxy = (IUserService) Proxy.newProxyInstance(
this.getClass().getClassLoader(), //类加载器
userService.getClass().getInterfaces(), //给接口proxy 才可以生产代理
new InvocationHandler() { //代理对象执行的接口
//代理对象 反射执行的方法
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
//这里进行增强
System.out.println("log 日志输出" + method.getName());
//真实对象执行 delete、save的方法
Object obj = method.invoke(userService,args);
return obj;
}
}
);
System.out.println("userServiceProxy = " + userServiceProxy);
userServiceProxy.save();
userServiceProxy.delete();
}
4、原理
1、使用工具类生产代理对象 字节码
java">public class ProxyUtils{
public static void main(String[] args) throws Exception {
saveProxyFile();
}
private static void saveProxyFile() throws IOException {
IUserService userService = new UserServiceImpl();
FileOutputStream out = null;
File file = new File("C:\\test\\" + "$Proxy0.class");
file.createNewFile();
try {
byte[] classFile = ProxyGenerator.generateProxyClass(
"$Proxy0",
userService.getClass().getInterfaces());
out = new FileOutputStream(file);
out.write(classFile);
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
if (out != null) {
out.flush();
out.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
2、源码分析