阿尔萨斯查看jdk动态代理生成类

2023-11-23 01:10

本文主要是介绍阿尔萨斯查看jdk动态代理生成类,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

1.先准备一份jdk代码实现类

public class JdkProxyTest {interface Foo {void eat(String food, int num);void drink(String water);}interface Bar {int say(String say);}static class FooImpl implements Foo, Bar {@Overridepublic void eat(String food, int num) {System.out.println("call FoolImpl eat() " + food + " " + num);}@Overridepublic void drink(String water) {System.out.println("call FoodImpl drink() " + water);}@Overridepublic int say(String say) {System.out.println("call FoodImpl say() " + say);return 3;}}public static void main(String[] args) {//目标对象FooImpl f = new FooImpl();//代理对象Bar foo = (Bar) Proxy.newProxyInstance(f.getClass().getClassLoader(), new Class[]{Foo.class, Bar.class}, (proxy, method, args1) -> {System.out.println("proxy.getClass().getName() = " + proxy.getClass().getName());System.out.println("我是代理类的invoke方法之前");Object result = method.invoke(f, args1);System.out.println("我是代理类的invoke方法之后");return result;});//foo.eat("瓜子", 250);// foo.drink("可乐");int ok = foo.say("ok");System.out.println("excute result "+ok);System.out.println(foo.getClass());while(true){}}
}

执行结果:
注意上图的蓝色部分

2.下载一份阿尔萨斯代码

阿尔萨斯地址链接:https://gitee.com/arthas/arthas
cmd进入jar目录: 启动jar包 java -jar arthas-boot.jar
执行结果
在这里插入图片描述
这里我们的类代号为5 我们按5然后按enter
在这里插入图片描述
然后从我们idea中打印的 System.out.println(foo.getClass());的结果中找到代理类的名称
在这里插入图片描述
在阿尔萨斯控制台执行 上面的class名称 jad develop.$Proxy0
在这里插入图片描述
执行结果

ClassLoader:
+-sun.misc.Launcher$AppClassLoader@18b4aac2+-sun.misc.Launcher$ExtClassLoader@294e68b4Location:/** Decompiled with CFR.*/
package develop;import develop.JdkProxyTest;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
import java.lang.reflect.UndeclaredThrowableException;final class $Proxy0
extends Proxy
implements JdkProxyTest.Foo,
JdkProxyTest.Bar {private static Method m1;private static Method m2;private static Method m4;private static Method m5;private static Method m3;private static Method m0;public $Proxy0(InvocationHandler invocationHandler) {super(invocationHandler);}static {try {m1 = Class.forName("java.lang.Object").getMethod("equals", Class.forName("java.lang.Object"));m2 = Class.forName("java.lang.Object").getMethod("toString", new Class[0]);m4 = Class.forName("develop.JdkProxyTest$Foo").getMethod("drink", Class.forName("java.lang.String"));m5 = Class.forName("develop.JdkProxyTest$Bar").getMethod("say", Class.forName("java.lang.String"));m3 = Class.forName("develop.JdkProxyTest$Foo").getMethod("eat", Class.forName("java.lang.String"), Integer.TYPE);m0 = Class.forName("java.lang.Object").getMethod("hashCode", new Class[0]);return;}catch (NoSuchMethodException noSuchMethodException) {throw new NoSuchMethodError(noSuchMethodException.getMessage());}catch (ClassNotFoundException classNotFoundException) {throw new NoClassDefFoundError(classNotFoundException.getMessage());}}public final boolean equals(Object object) {try {return (Boolean)this.h.invoke(this, m1, new Object[]{object});}catch (Error | RuntimeException throwable) {throw throwable;}catch (Throwable throwable) {throw new UndeclaredThrowableException(throwable);}}public final String toString() {try {return (String)this.h.invoke(this, m2, null);}catch (Error | RuntimeException throwable) {throw throwable;}catch (Throwable throwable) {throw new UndeclaredThrowableException(throwable);}}public final int hashCode() {try {return (Integer)this.h.invoke(this, m0, null);}catch (Error | RuntimeException throwable) {throw throwable;}catch (Throwable throwable) {throw new UndeclaredThrowableException(throwable);}}public final int say(String string) {try {return (Integer)this.h.invoke(this, m5, new Object[]{string});}catch (Error | RuntimeException throwable) {throw throwable;}catch (Throwable throwable) {throw new UndeclaredThrowableException(throwable);}}public final void eat(String string, int n) {try {this.h.invoke(this, m3, new Object[]{string, n});return;}catch (Error | RuntimeException throwable) {throw throwable;}catch (Throwable throwable) {throw new UndeclaredThrowableException(throwable);}}public final void drink(String string) {try {this.h.invoke(this, m4, new Object[]{string});return;}catch (Error | RuntimeException throwable) {throw throwable;}catch (Throwable throwable) {throw new UndeclaredThrowableException(throwable);}}
}

上述代码就是动态生成的代理对象代码

如果不想用阿尔萨斯:可以直接设置系统属性 在main方法中添加添加如下代码,最后会在项目根路径下保存生成的动态代理类


//JDK1.8及以前的版本
System.getProperties().put("sun.misc.ProxyGenerator.saveGeneratedFiles", "true");//JDK1.8以后的版本
System.getProperties().put("jdk.proxy.ProxyGenerator.saveGeneratedFiles", "true");

这篇关于阿尔萨斯查看jdk动态代理生成类的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/414237

相关文章

MybatisGenerator文件生成不出对应文件的问题

《MybatisGenerator文件生成不出对应文件的问题》本文介绍了使用MybatisGenerator生成文件时遇到的问题及解决方法,主要步骤包括检查目标表是否存在、是否能连接到数据库、配置生成... 目录MyBATisGenerator 文件生成不出对应文件先在项目结构里引入“targetProje

java脚本使用不同版本jdk的说明介绍

《java脚本使用不同版本jdk的说明介绍》本文介绍了在Java中执行JavaScript脚本的几种方式,包括使用ScriptEngine、Nashorn和GraalVM,ScriptEngine适用... 目录Java脚本使用不同版本jdk的说明1.使用ScriptEngine执行javascript2.

Python使用qrcode库实现生成二维码的操作指南

《Python使用qrcode库实现生成二维码的操作指南》二维码是一种广泛使用的二维条码,因其高效的数据存储能力和易于扫描的特点,广泛应用于支付、身份验证、营销推广等领域,Pythonqrcode库是... 目录一、安装 python qrcode 库二、基本使用方法1. 生成简单二维码2. 生成带 Log

Python如何使用seleniumwire接管Chrome查看控制台中参数

《Python如何使用seleniumwire接管Chrome查看控制台中参数》文章介绍了如何使用Python的seleniumwire库来接管Chrome浏览器,并通过控制台查看接口参数,本文给大家... 1、cmd打开控制台,启动谷歌并制定端口号,找不到文件的加环境变量chrome.exe --rem

Debian如何查看系统版本? 7种轻松查看Debian版本信息的实用方法

《Debian如何查看系统版本?7种轻松查看Debian版本信息的实用方法》Debian是一个广泛使用的Linux发行版,用户有时需要查看其版本信息以进行系统管理、故障排除或兼容性检查,在Debia... 作为最受欢迎的 linux 发行版之一,Debian 的版本信息在日常使用和系统维护中起着至关重要的作

VUE动态绑定class类的三种常用方式及适用场景详解

《VUE动态绑定class类的三种常用方式及适用场景详解》文章介绍了在实际开发中动态绑定class的三种常见情况及其解决方案,包括根据不同的返回值渲染不同的class样式、给模块添加基础样式以及根据设... 目录前言1.动态选择class样式(对象添加:情景一)2.动态添加一个class样式(字符串添加:情

Python使用Pandas库将Excel数据叠加生成新DataFrame的操作指南

《Python使用Pandas库将Excel数据叠加生成新DataFrame的操作指南》在日常数据处理工作中,我们经常需要将不同Excel文档中的数据整合到一个新的DataFrame中,以便进行进一步... 目录一、准备工作二、读取Excel文件三、数据叠加四、处理重复数据(可选)五、保存新DataFram

SpringBoot生成和操作PDF的代码详解

《SpringBoot生成和操作PDF的代码详解》本文主要介绍了在SpringBoot项目下,通过代码和操作步骤,详细的介绍了如何操作PDF,希望可以帮助到准备通过JAVA操作PDF的你,项目框架用的... 目录本文简介PDF文件简介代码实现PDF操作基于PDF模板生成,并下载完全基于代码生成,并保存合并P

SpringCloud配置动态更新原理解析

《SpringCloud配置动态更新原理解析》在微服务架构的浩瀚星海中,服务配置的动态更新如同魔法一般,能够让应用在不重启的情况下,实时响应配置的变更,SpringCloud作为微服务架构中的佼佼者,... 目录一、SpringBoot、Cloud配置的读取二、SpringCloud配置动态刷新三、更新@R

Java汇编源码如何查看环境搭建

《Java汇编源码如何查看环境搭建》:本文主要介绍如何在IntelliJIDEA开发环境中搭建字节码和汇编环境,以便更好地进行代码调优和JVM学习,首先,介绍了如何配置IntelliJIDEA以方... 目录一、简介二、在IDEA开发环境中搭建汇编环境2.1 在IDEA中搭建字节码查看环境2.1.1 搭建步