本文共 1154 字,大约阅读时间需要 3 分钟。
这个类就可以找到答案:org.springframework.aop.framework.DefaultAopProxyFactory
由源码可得:
JDK动态代理:当代理类为接口时采用Jdk动态代理 Cglib动态代理:cglib是针对类来实现代理的可做这么一个操作: 模拟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动态代理是基于接口而不是继承实现的。
转载地址:http://nuqgn.baihongyu.com/