使用Arthas查看JDK代理源码

news2024/9/24 19:15:01

【README】

本文总结自黑马程序员-设计模式,老师讲的非常棒;

【1】jdk代理案例

卖票接口

public interface SellTickets2 {
    void sell();
}

火车站

public class TrainStation2 implements SellTickets2 {

    @Override
    public void sell() {
        System.out.println("火车站卖票");
    }
}

jdk代理工厂

public class JdkProxyFactory {

    // 声明目标对象
    private TrainStation2 trainStation = new TrainStation2();

    public SellTickets2 getProxyObject(){
        return (SellTickets2) Proxy.newProxyInstance(
                TrainStation2.class.getClassLoader(),
                TrainStation2.class.getInterfaces(),
                new InvocationHandler() {
                    @Override
                    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
                        System.out.println("代售点收取服务费5元-jdk动态代理");
                        // 执行目标对象方法
                        Object returnObject = method.invoke(trainStation, args);
                        return returnObject;
                    }
                }
        );
    }
}

测试案例;

public class JdkProxyTest {
    public static void main(String[] args) {
        JdkProxyFactory jdkProxyFactory = new JdkProxyFactory();
        SellTickets2 proxyObject = jdkProxyFactory.getProxyObject();
        proxyObject.sell();

        System.out.println(proxyObject.getClass());
        while (true); // 死循环只是为了让当前线程不结束,内存不被回收
    }
}

【2】通过Arthas查看JDK代理源码 

1)下载 arthas, 快速入门 | arthas

2)解压后,在命令行执行:

C:\Users\pacoson>cd D:\software_cluster\arthas\arthas-bin

C:\Users\pacoson>d:

D:\software_cluster\arthas\arthas-bin>java -jar arthas-boot.jar

3)录入jvm线程编号【4】

 4)jad命令查看clazz类源码:

[arthas@18092]$ jad com.sun.proxy.$Proxy0 
[arthas@18092]$ jad com.sun.proxy.$Proxy0

ClassLoader:
+-sun.misc.Launcher$AppClassLoader@18b4aac2
  +-sun.misc.Launcher$ExtClassLoader@56d54148

Location:

/*
 * Decompiled with CFR.
 *
 * Could not load the following classes:
 *  com.cmc.designpattern.patterns.proxy.jdk_proxy.SellTickets2
 */
package com.sun.proxy;

import com.cmc.designpattern.patterns.proxy.jdk_proxy.SellTickets2;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
import java.lang.reflect.UndeclaredThrowableException;

public final class $Proxy0
extends Proxy
implements SellTickets2 {
    private static Method m1;
    private static Method m2;
    private static Method m3;
    private static Method m0;
  
// ................................................

5)删除冗余代码后的Proxy类核心代码如下:

package com.sun.proxy;

import com.cmc.designpattern.patterns.proxy.jdk_proxy.SellTickets2;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
import java.lang.reflect.UndeclaredThrowableException;

public final class $Proxy0 extends Proxy implements SellTickets2 {
    private static Method m1;
    private static Method m2;
    private static Method m3;
    private static Method m0;

    public $Proxy0(InvocationHandler invocationHandler) {
        super(invocationHandler);
    }

    static {
        m3 = Class.forName("com.cmc.designpattern.patterns.proxy.jdk_proxy.SellTickets2").getMethod("sell", new Class[0]);
    }

    public final void sell() {       
      this.h.invoke(this, m3, null);                   
    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/696622.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Vulnhub: DarkHole:1靶机

kali:192.168.111.111 靶机:192.168.111.130 信息收集 端口扫描 nmap -A -sC -v -sV -T5 -p- --scripthttp-enum 192.168.111.130 访问目标web网站,注册用户 注册时尝试注册用户名为admin的用户,发现存在该用户 进入用户后台&…

孪生网络:图片相似度对比神器

本文来自公众号“AI大道理” ​ Siamese Network(孪生网络)很早就被发明了,它的作者是著名的卷积神经网络LeNet-5的作者LeCun。 最早用来从相似图片数据集上学习图片表示的网络结构就是siamese网络。 两幅图通过两个共享权重的CNN得到各自…

【Redis】Redis简介及安装部署

Redis简介及安装部署 1.关系数据库 VS 非关系型数据库1.1 关系型数据库1.2 非关系型数据库1.3 关系型数据库和非关系型数据库区别1.4 非关系型数据库产生背景1.5 关系型数据库与非关系型数据库总结 2.Redis简介2.1 Redis概述2.2 Redis的优点2.3 Redis使用场景2.4 关于Redis的高…

一步一步学OAK之一: Hello World(使用DepthAI Python API 显示彩色视频流)

作为编程世界的传统入门仪式,我们这里也以Hello World来命名我们的第一个项目,其实我们这个项目与Hello World没有半毛钱关系。 在这个程序中,我们使用DepthAI Python API来一步步实现显示OAK相机彩色视频流,并捕捉物体的功能 目…

CSS 仿 -webkit-box-reflect 属性实现 图片 镜面 倒影 效果

背景 最近在支付宝小程序上面要实现图片的镜面倒影效果,于是乎,马上找到了-webkit-box-reflect属性,用上之后真的绝绝子,模拟器上也很完美,可是到真机上一看,iOS 不支持,只有安卓手机支持&…

基于web的家校联系平台的设计与实现(源码+文档+PPT+数据库)

以 web为基础、以 Java SSM (springmvc mybatis mysql)为框架、以spring, springmvc, mybatis, bootstrap, JSP, jquery为主要技术来完成一个家庭与学校之间的联系。在框架下进行开发,管理员可以在后台输入信息、管理信息,设置网站信息,管理和…

【FFmpeg实战】H264 NALU分析

视频序列 宏块结构 NALU分层 H264的主要目标是为了有高的视频压缩比和良好的网络亲和性,为了达成这两个目标,H264的解决方案是将系统框架分为两个层面, VCL(视频编码层)和 NAL(网络提取层). VCL:包括核心压缩引擎和块&#xff…

[数据分析与可视化] 基于matplotlib-scalebar库绘制比例尺

matplotlib-scalebar是一个Python库,用于在matplotlib图形中添加比例尺。它允许用户指定比例尺的大小、位置、字体和颜色,以及比例尺的单位。该库支持不同的比例尺单位,例如米、英尺、英寸等。matplotlib-scalebar安装命令如下: p…

王道考研计算机网络第三章知识点汇总

3.1数据链路层功能概述: 3.2封装成帧和透明传输 重点理解透明传输的概率:可以形象地理解为小秘没有权限打开这5份文件 字符计数法如果其中一个计数字段出差错那么后续字段全部都错误,将会导致灾难性的错误。 字符填充法相当于编程时在/前面再…

JsFu0k批量探测JS存在的敏感关键字

这是一个演示 GitHub地址:https://github.com/jumppppp/go/tree/master/htools/jsfu0k 输出窗口 输出的详细文件 以上演示的是全字匹配 这个自动化工具模仿人工在一个网页内进行寻找js中敏感信息 流程: 填写配置(输入批量域名&#xff0…

【每天40分钟,我们一起用50天刷完 (剑指Offer)】第九天 9/50

专注 效率 记忆 预习 笔记 复习 做题 欢迎观看我的博客,如有问题交流,欢迎评论区留言,一定尽快回复!(大家可以去看我的专栏,是所有文章的目录)   文章字体风格: 红色文字表示&#…

Eclipse中的实用工具之Debug

🥳🥳Welcome Huihuis Code World ! !🥳🥳 接下来看看由辉辉所写的关于Debug的相关操作吧 目录 🥳🥳Welcome Huihuis Code World ! !🥳🥳 一.什么是Debug 二.为什么要使用Debug 三…

springboot+element-ui多文件一次上传

前端&#xff1a; <el-uploaddrag:multiple"true":limit"10":auto-upload"false":file-list"fileList"ref"fileUpload"><i class"el-icon-upload"></i><div class"el-upload__text&quo…

【云原生】Pause 容器介绍

Pause 容器 Pause 容器&#xff0c;又叫 Infra 容器 我们知道在 kubelet 的配置中有这样一个参数&#xff1a; KUBELET_POD_INFRA_CONTAINER--pod-infra-container-imageregistry.access.redhat.com/rhel7/pod-infrastructure:latest上面是 openshift 中的配置参数&#xff…

关于Java类加问题我竟让面试官哑口无言

学习类加载之前我们先看看从面试官的角度会问哪些问题&#xff1f;毕竟带着问题学习会比较高效。 直击面试 看你简历写得熟悉 JVM&#xff0c;那你说说类的加载过程吧&#xff1f; 我们可以自定义一个 String 类来使用吗&#xff1f; 什么是类加载器&#xff0c;类加载器有哪些…

雨水情自动监测报警系统解决方案

随着夏季雨季的到来&#xff0c;对全国各地的防汛工作形成挑战&#xff0c;为了实现有效的雨水管理和应对极端天气情况&#xff0c;建立一套科学高效的雨水情监测系统有着重要作用。雨水情监测系统能够提供及时准确的雨水信息&#xff0c;帮助决策者进行全面的天气分析和预警&a…

数字化转型排头兵,金融行业如何利用科技赋能业务 | TVP金融交流会

引言 金融行业&#xff0c;是数字化转型浪潮中的排头兵。这个上千年来&#xff0c;不断创新的行业&#xff0c;从以物易物到纸币发行再到数字资产&#xff0c;承袭至今的是保障客户资产安全&#xff0c;提升资产流通效率的本心。进入产业互联网时代以后&#xff0c;金融科技的发…

第5讲:使用ajax技术实现局部刷新功能(xml数据)

使用ajax技术实现局部刷新功能&#xff0c;每2秒刷新一次数据&#xff0c;本案例使用原生态xmlhttprequest对象&#xff0c;GET方法通讯&#xff0c;使用responseXML属性返回xml格式数据&#xff0c;同时刷新界面数据。 ajax封装库(ajax.js) var xmlhttpnull; //创建XMLHttpRe…

adb-学会查看日志文件

目录 一、获取日志文件 二、日志级别 三、日志缓冲区 四、缓冲区的类型 &#x1f381;更多干货 完整版文档下载方式&#xff1a; 一、获取日志文件 一般情况下&#xff0c;我们在做app测试时&#xff0c;其实并不需要经常使用adb去抓取我们的日志&#xff0c;通常情况下…

使用GPIO来模拟UART

前言 最近在看一些秋招的笔试和面试题&#xff0c;刚好看到一个老哥的经验贴&#xff0c;他面试的时候被问到了如果芯片串口资源不够了该怎么办&#xff1f;其实可以用IO口来模拟串口&#xff0c;但我之前也没有具体用代码实现过&#xff0c;借此机会用32开发板上的两个IO口来…