阿尔萨斯查看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

相关文章

Android 悬浮窗开发示例((动态权限请求 | 前台服务和通知 | 悬浮窗创建 )

《Android悬浮窗开发示例((动态权限请求|前台服务和通知|悬浮窗创建)》本文介绍了Android悬浮窗的实现效果,包括动态权限请求、前台服务和通知的使用,悬浮窗权限需要动态申请并引导... 目录一、悬浮窗 动态权限请求1、动态请求权限2、悬浮窗权限说明3、检查动态权限4、申请动态权限5、权限设置完毕后

浅析如何使用Swagger生成带权限控制的API文档

《浅析如何使用Swagger生成带权限控制的API文档》当涉及到权限控制时,如何生成既安全又详细的API文档就成了一个关键问题,所以这篇文章小编就来和大家好好聊聊如何用Swagger来生成带有... 目录准备工作配置 Swagger权限控制给 API 加上权限注解查看文档注意事项在咱们的开发工作里,API

Java使用POI-TL和JFreeChart动态生成Word报告

《Java使用POI-TL和JFreeChart动态生成Word报告》本文介绍了使用POI-TL和JFreeChart生成包含动态数据和图表的Word报告的方法,并分享了实际开发中的踩坑经验,通过代码... 目录前言一、需求背景二、方案分析三、 POI-TL + JFreeChart 实现3.1 Maven

Java导出Excel动态表头的示例详解

《Java导出Excel动态表头的示例详解》这篇文章主要为大家详细介绍了Java导出Excel动态表头的相关知识,文中的示例代码简洁易懂,具有一定的借鉴价值,有需要的小伙伴可以了解下... 目录前言一、效果展示二、代码实现1.固定头实体类2.动态头实现3.导出动态头前言本文只记录大致思路以及做法,代码不进

vue基于ElementUI动态设置表格高度的3种方法

《vue基于ElementUI动态设置表格高度的3种方法》ElementUI+vue动态设置表格高度的几种方法,抛砖引玉,还有其它方法动态设置表格高度,大家可以开动脑筋... 方法一、css + js的形式这个方法需要在表格外层设置一个div,原理是将表格的高度设置成外层div的高度,所以外层的div需要

SpringBoot实现动态插拔的AOP的完整案例

《SpringBoot实现动态插拔的AOP的完整案例》在现代软件开发中,面向切面编程(AOP)是一种非常重要的技术,能够有效实现日志记录、安全控制、性能监控等横切关注点的分离,在传统的AOP实现中,切... 目录引言一、AOP 概述1.1 什么是 AOP1.2 AOP 的典型应用场景1.3 为什么需要动态插

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