当前位置:首页 > CN2资讯 > 正文内容

查看动态代理生成的代理类字节码

2天前CN2资讯


文章目录

  • ​​动态代理的知识介绍​​
  • ​​用java proxy实现动态代理​​
  • ​​查看生成的class代理类字节码​​
  • ​​创建代理的源码​​

动态代理的知识介绍

一、动态代理和Class字节码的关系

动态代理有什么作用及应用场景?
  1.日志集中打印
  2.事务
  3.权限管理
  4.AOP

在Spring Aop当中可以哪些方式实现,及区别?
  l.java Proxy(动态构建字节码)(动态构建全新字节码bean初始化的时候)
  2.cglib(动态构建字节码)(动态构建全新字节码bean初始化的时候)
  3.Aspecti(修改目标类的字节,织入代理的字节,在程序编译(编译的时候插入动态代理的字节码,不会生成全新的Class)
  4.instrumentation(修改目标类的字节码、类装载的时候动态拦截去修改,基于iavaagent)-javaagent:spring-instrument-4.3.8.RELEASE.jar(类装载的时候插入动态代理的字节码,不会生成全新的Class)

关于实现动态代理的技术

1.动态代理可以由java proxy、cglib、instrumentation(javaagent)、Aspectj、等多种方式实现
  2.动态代理本质是对class字节码进行动态构建或修改。
  3.修改的工具有ASM、javavssist
  4.多种实现方式的区别在于对字节码切入方式不一样。可选方式的有:

java proxy、Cglib是基于动态构建接口实现类字节

AspectJ是借助Eclipse工具在编译时织入代理字节

instrumentation是基于javaagent在类装载时修改Class织入代理字节

使用字定义ClassLoader在装载时织入代理字节JAVA Proxy实现过程

动态代理技术栈图:

用java proxy实现动态代理

一个简单实现的例子:

public interface User {
String getName(String name);
}

```java
public class Userimpl implements User{
@Override
public String getName(String name) {
System.out.println("实现类");
return name;
}
}```java
public class UserProxy {
public static void main(String[] args) {
final Userimpl userimpl = new Userimpl();
User targetproxy = (User) Proxy.newProxyInstance(UserProxy.class.getClassLoader(), new Class[]{User.class}, new InvocationHandler() {

@Override
public Object invoke(Object proxy, Method method, Object[] myargs) throws Throwable {
System.out.println("q我是前置");
try {
return method.invoke(userimpl,myargs);
} finally {
System.out.println("后置");
}

}
});
targetproxy.getName("hzy");
}
}

查看生成的class代理类字节码

public static void buildProxy() throws IOException {
byte[] bytes = ProxyGenerator.generateProxyClass("User$proxy",new Class[]{User.class});
String fileName = System.getProperty("user.dir")+"\\target\\UserService$proxy.class";

File file = new File(fileName);

FileOutputStream fileOutputStream = new FileOutputStream(file);
fileOutputStream.write(bytes);
fileOutputStream.flush();
fileOutputStream.close();
}

在上面的main函数中加上 buildProxy()方法,执行后查看文件目录:


可以看到生成的class文件

把文件拖到idea里面,可以看到反编译后的文件:

创建代理的源码

首先是newProxyInstance方法:


可以看到进入了这句 Class<?> cl = getProxyClass0(loader, intfs);//寻找或者生成目标代理类

private static Class<?> getProxyClass0(ClassLoader loader,
Class<?>... interfaces) {
if (interfaces.length > 65535) {
throw new IllegalArgumentException("interface limit exceeded");
}

// If the proxy class defined by the given loader implementing
// the given interfaces exists, this will simply return the cached copy;
// otherwise, it will create the proxy class via the ProxyClassFactory
return proxyClassCache.get(loader, interfaces);
}

这个注释的意思:如果由实现给定接口的给定加载器定义的代理类存在,这将简单地返回缓存副本;否则,它将通过 ProxyClassFactory 创建代理类,即判断这个接口是不是已经装载class,如果有则直接返回

之后还有apply方法、proxyfactory中的方法等等,比较复杂,以后再仔细学。


    你可能想看:

    扫描二维码推送至手机访问。

    版权声明:本文由皇冠云发布,如需转载请注明出处。

    本文链接:https://www.idchg.com/info/24474.html

    分享给朋友:

    “查看动态代理生成的代理类字节码” 的相关文章

    国外服务器推荐:提升您的在线业务效率的最佳选择

    在如今全球化的时代,选择合适的国外服务器显得尤为重要。互联网的快速发展让许多企业不仅仅局限于当地市场,跨国经营已成为常态。这种趋势使得大量用户开始寻找更为高效、灵活的服务器解决方案,以满足不同地区客户的需求。服务器不仅是维护在线业务的基础设施,还是保证用户体验的关键因素。 选择国外服务器时,不仅需要...

    SpartanHost VPS主机评测:高性能与安全性的理想选择

    在我开始探索VPS主机市场时,SpartanHost引起了我的注意。这个公司成立于2013年,自那时起便在行业中扎根,专注于提供高性能的VPS解决方案。他们使用的是基于KVM架构的主机产品,充分满足用户的需求。从他们的运营历史来看,尽管时间不算很久,但SpartanHost凭借其稳定的服务和灵活的选...

    2024年如何获取免费VPS服务:开发者的最佳选择

    在解释什么是免费VPS之前,我想先来聊聊“VPS”这个概念。虚拟专用服务器(VPS)可以理解为一种在服务器上创建多个虚拟环境的技术。这些环境如同独立的服务器,用户可以在上面进行程序的开发和测试。而“免费VPS”则意味着用户可以在一定的限度内,无需付费地使用这些虚拟环境。对于初创公司或个人开发者而言,...

    如何利用阿里云24元优惠活动体验云计算服务

    阿里云是一家全球知名的云计算服务提供商,致力于为用户提供多样化的云计算产品与服务。最近推出的24元优惠活动,更是为不少用户带来了新的机遇。这项优惠活动的主要目标是让更多的个人和企业体验到优质的云服务,尤其是在数字化转型日益重要的今天。用户可以通过这一活动以超低价格体验阿里云的强大功能。 在参与这个优...

    搬瓦工DC9:高性价比VPS选择,稳定快速的服务器解决方案

    在这个快速发展的互联网时代,越来越多的人开始寻求高效、稳定的服务器解决方案。搬瓦工DC9正是为满足这种需求而推出的一款限量版VPS套餐。它不仅方便快捷,而且在性能和性价比上都表现出色,让用户在搭建网站、进行游戏或其他项目时更加省心。 搬瓦工DC9的全名是“The DC9 Plan”,每年仅需38美元...

    如何在Vultr上添加适合的充值金额和选择合适的VPS方案

    Vultr概述 Vultr是一家在云服务领域颇有声誉的公司,它以提供高性能的虚拟专用服务器(VPS)而闻名。Vultr不仅在全球范围内拥有多个数据中心,还以其灵活的方案和易于扩展的功能,赢得了众多用户的青睐。在激烈的市场竞争中,Vultr凭借其合理的价格和优化的服务流程,使自己脱颖而出,成为许多个人...