1.什么情况下是Cglib动态代理和JDK动态代理?
这个类就可以找到答案:org.springframework.aop.framework.DefaultAopProxyFactory
由源码可得:
JDK动态代理:当代理类为接口时采用Jdk动态代理
Cglib动态代理:cglib是针对类来实现代理的
2.jdk动态代理为什么必须是基于接口实现的?
可做这么一个操作: 模拟Aop源码中生成JDK动态代理对象的字节码方法
创建一个Service接口
package com.sol.springframework.service;
import com.sol.springframework.pojo.LoginUser;
/**
* @author: lujie
* @create: 2020/3/24
* @description: LoginService
**/
public interface LoginService {
/**
* 模拟登陆方法
* @param id
* @return
*/
LoginUser login(Long id);
}
生成字节码对象文件
public static void main(String[] args) {
Class<?>[] interfaces = new Class[]{LoginService.class} ;
byte[] bytes = ProxyGenerator.generateProxyClass("LoginService", interfaces);
File file = new File("F:\\LoginService$Proxy.class") ;
FileOutputStream fo = null;
try {
fo = new FileOutputStream(file);
fo.write(bytes);
fo.flush();
fo.close();
} catch (Exception e) {
e.printStackTrace();
}
}
生成的文件如下:
将生成的字节码放入IDEA targe目录中查看内容
可以明显的看到class文件已经继承了Proxy,java是单一继承的,可以多实现的,所以不能继承目标对象,只能实现目标对象接口,所以jdk动态代理是基于接口而不是继承实现的。