查明一种方法是否可以调用另一种方法

2024-01-22

我试图弄清楚如何获取 Java pojo,并分析它的方法以获取它可以调用的所有其他方法和函数。例如,以下是输出的硬编码示例。我怎样才能使这个通用?我需要以编程方式分析 Java 对象,以确定它们在执行时可以调用哪些方法。例子:

package com.example.analyze;

public class Main
{

    private static class Foo {

        public void foo(int value, Bar bar) {
            if(value > 5)
                bar.gaz();
        }
    }

    private static class Bar {

        public void gaz() {
            System.out.println("gaz");
        }
    }

    private static class Analyzer {

        public void analyze(Object object){
            System.out.println("Object method foo could call Bar method gaz");
        }

    }

    public static void main(String[] args)
    {
        Foo foo = new Foo();
        Analyzer analyzer = new Analyzer();
        analyzer.analyze(foo);
    }
}

您需要的是构造一个调用图,然后询问调用图中两个节点(调用者和被调用者)是否连接。这不是一件容易的事。

你需要做什么:

  • 解析构成您的应用程序的源代码。 Java 解析器相对容易找到。 Java 1.8 解析器,不是那么容易,但是有一个隐藏在您可以使用的 Java 编译器中,另一个隐藏在 Eclipse JDT 中;我公司还随 DMS 工具包提供了一个。
  • 为其构建抽象语法树;你需要代码结构。 Java编译器、JDT和DMS都可以做到这一点。
  • 执行名称和类型解析。您需要知道每个符号的定义意味着什么。 Java 编译器肯定会一次针对一个编译单元执行此操作。 JDT 可以对许多文件执行此操作;我对此没有太多经验。 DMS 可以同时对非常大的 Java 源文件集执行此操作。
  • 现在您需要进行(对象)指向分析:您想知道,对于任何(对象值)字段,它可能指向哪些特定实例对象;这最终会告诉你它可能被用来触发什么方法。您将通过检查 AST 和说明每个符号含义的符号表定义来获取此任务的信息。如果您看到 X.f=new foo;你知道 X 中的 f 可以指向 foo,这是一个基本事实。泛型和类型擦除让这一切变得混乱。如果你看到Y.g=Z.h,你就知道Y中的g可以指向Z中的h可以指向的任何东西;当然,Z 可能是继承自 Z 的类。如果您看到 Y.g=a[...],那么您就知道 Y 中的 g 可以指向可能已分配给数组 a 的任何对象。如果您看到 Y.g=bar(...) 那么您就知道 Y 中的 g 可以指向 bar 可能返回的任何内容;不幸的是,您现在需要一个调用图来狭隘地回答这个问题。您可以通过多种方式近似这一点以获得保守的答案。现在您知道了值之间如何相关,您必须对该集合采用传递闭包,以了解每个 Y 中的每个 g 可以指向什么。如果考虑各个方法的控制和数据流,您可以获得更精确的答案,但这需要更多的机械构造。 (这里有更多详细信息点分析 http://www.seas.harvard.edu/courses/cs252/2011sp/slides/Lec06-PointerAnalysis.pdf.) Java 编译器在编译时会计算其中一些信息,但不会计算整个源文件系统;请记住,它一次处理一个源文件。我认为 JDT 根本不会尝试这样做。我们的 DMS 还没有做到这一点,但我们已经对 2600 万行 C 代码的系统做到了这一点;这可以说是一个更难的问题,因为人们用指针做各种滥用的事情,包括撒谎的强制转换。
  • 最后你可以构建一个调用图。对于每个方法,构造一个调用图节点。对于方法中的每个调用站点,确定其被调用者集并将调用节点链接到被调用节点。上一步已收集了提供这些链接所需的信息。

[您也许可以使用以下方法避免上面的解析/名称类型解析部分Wala http://wala.sourceforge.net/wiki/index.php/Main_Page,它基本上是通过执行上述大部分操作来构建的]。

通过调用图,如果你想知道A是否可以调用B,就在调用图中找到A的节点,看看是否有到B的路径。

这里的另一个注释表明,对于编译器类来说,这是一项为期 6 个月的任务。我认为对于一个有经验的编译器人员来说这是 6 个月,或者更多(而且我们还没有解决类加载器和反射调用等讨厌的问题)。

我认为你最好找到一个其他人已经构建的解决方案。可能有人有;它不太可能轻易找到,或者她想放弃它。您可能会发现在大学中完成了实施;学者们撰写了各种各样的论文(并有原型支持)来计算对象图。缺点是所有这些系统are原型,并且是由小型、无薪的毕业生团队构建的,他们通常不能处理所有的边缘情况,更不用说最新版本的 Java(lambdas,有人吗?)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

查明一种方法是否可以调用另一种方法 的相关文章

随机推荐

  • 什么是NTFS格式文件系统?Tuxera NTFS for Mac2024下载步骤

    一般磁盘格式分为 FAT FAT32 NTFS 这几种格式目前是我们最常遇到的文件系统格式 其中现在遇到最多的就是NTFS格式 为更好地了解这类文件系统格式 小编今天专门介绍一下什么是NTFS格式文件系统以及它的特点和局限性 一 什么是NT
  • 蒙特卡洛在发电系统中的应用(Matlab代码实现)

    欢迎来到本博客 博主优势 博客内容尽量做到思维缜密 逻辑清晰 为了方便读者 座右铭 行百里者 半于九十 本文目录如下 目录 1 概述 2 运行结果 3 参考文献 4 Matlab代码实现
  • 使用企业订货软件的担忧与考虑|网上APP订货系统

    使用企业订货软件的担忧与考虑 网上APP订货系统 网上订货系统担心出现的问题 1 如果在订货系统中定错 多 货物了该怎么办 其实这也是很多人在网购或者是现实中经常会犯的一个错误 但是网上订货平台为大家提供了很多的解决方案 其中对于订单的修改
  • 3D点云检测神技 | UFO来了!让PointPillars、PV-RCNN统统涨点!

    作者 AI驾驶员 编辑 智驾实验室 点击下方 卡片 关注 自动驾驶之心 公众号 ADAS巨卷干货 即可获取 点击进入 自动驾驶之心 3D目标检测 技术交流群 本文只做学术分享 如有侵权 联系删文 在这篇论文中提出了一个关于在3D点云中检测未
  • 超越BEVFusion!又快又好的极简BEV融合部署方案

    点击下方 卡片 关注 自动驾驶之心 公众号 ADAS巨卷干货 即可获取 gt gt 点击进入 自动驾驶之心 多传感器融合 技术交流群 论文作者 Junjie Huang 编辑 自动驾驶之心 写在前面 笔者的个人理解 在算法开发中 激光雷达
  • 史上最全自动驾驶岗位介绍

    作者 自动驾驶转型者 编辑 汽车人 原文链接 https zhuanlan zhihu com p 353480028 点击下方 卡片 关注 自动驾驶之心 公众号 ADAS巨卷干货 即可获取 点击进入 自动驾驶之心 求职交流 技术交流群 本
  • 地平线 | Occupancy方向实习生招聘!

    点击下方 卡片 关注 自动驾驶之心 公众号 ADAS巨卷干货 即可获取 点击进入 自动驾驶之心 求职交流 技术交流群 岗位说明 参与cvpr2024 occupancy network相关赛道 获取靠前名次 参与核心算法方案的开发并沉淀平台
  • 开始弃用NeRF?为什么Gaussian Splatting在自动驾驶场景如此受欢迎?(浙江大学最新)...

    点击下方 卡片 关注 自动驾驶之心 公众号 ADAS巨卷干货 即可获取 今天自动驾驶之心为大家分享浙大刚刚出炉的3D Gaussian Splatting综述 文章首先回顾了3D Gaussian的原理和应用 借着全面比较了3D GS在静态
  • Camtasia2024最新版本如何进行电脑录制屏幕?

    在现在的网络互联网时代 越来越多的人走上了自媒体的道路 有些自媒体人会自己在网络上录制精彩视频 也有一些人会将精彩 热门的电影剪辑出来再加上自己给它的配音 做成大家喜欢看的电影剪辑片段 相信不管大家是自己平时有独特的爱好也好 还是自己的职业
  • 红警源代码居然开源了....

    来源 小詹学Python 红警 准确的说应该叫 红色警戒 是大部分 80 后记忆里跟游戏二字关系最深的情节 相信每一名 80 后 都有一段难忘的红警岁月 甚至可以说很多人的青春 就叫红警 说到红色警戒游戏 估计应该是很多同学的童年回忆了吧
  • windows 杀死占用端口的程序

    在Windows上 你可以使用以下命令来查找并杀死占用某个端口 如9200 的程序 打开命令提示符 Command Prompt 或者PowerShell 运行以下命令来查找占用9200端口的程序的进程ID PID netstat ano
  • 软件测试/测试开发/全日制/测试管理丨Android WebView 技术原理

    Android WebView是一个内置的组件 允许在Android应用中嵌套显示Web内容 Android WebView的技术原理涉及到使用WebKit引擎来渲染Web内容 并提供一系列API和回调函数 使得开发人员可以控制和定制Web
  • EDI项目上线前必须完成的几项工作

    企业自主实施EDI项目无论是对企业还是对EDI供应商而言都是一个很理想的选择 企业最初接触EDI 对于EDI报文以及传输协议并不了解 这将导致企业误以为自主实施的门槛很高 从而选择通过专业的EDI团队来完成EDI项目 看起来省时省力 但后期
  • CS5569 typec转HDMI 8k60hz单转带pd快充方案

    集睿致远 ASL的CS5269是一款低成本 低功耗的半导体器件 通过USBType C连接器将DisplayPort信号转换为HDMI 2 1 这款创新的基于USBType C的DisplayPort接收器具有高性能DSC解码器 集成的HD
  • datagridview中的单元格双击事件

    我有两个DataGridView事件 我有一个问题 当我双击一个单元格时 这两个事件 即cell click and cell double click正在调用事件 请向我提供答案为什么会发生这种情况以及解决方案是什么 Thanks 显然
  • PHP 里面有 Javascript 吗?

    我有以下代码 function deletet username if confirm Do you REALLY want to delete your account if confirm Are you POSITIVE var ch
  • 如何在本地主机和 Web 服务器上实现绝对 URL?

    我通常使用以下链接实践 具有绝对 URL 路径的相对 URL https stackoverflow com a 904066 1779823 a href relative path to document html 但我会实施绝对网址
  • PHP 将术语分解为数组,将引用的文本保留为单个数组项

    我有来自表单的以下字符串 Opera 添加跨平台硬件 踢屁股 嬉皮士 一般来说 我只是使用以下 p0 explode string 但是现在我想将所有引用运算符维护为单个数组项 而不是让它们创建单独的项 例如 adds cross plat
  • 如何跨 SMB 挂载进行 PHP 复制

    我有一个简单的脚本 可以将文件从一个 SMB 安装复制到另一个 源文件系统相同 但Web服务器不同 我使用 PHP 来处理该文件 方法是将其复制到临时目录 然后对其执行其他任务 此设置在某个时间点可以正常工作 但似乎不再正常工作 有人能指出
  • 查明一种方法是否可以调用另一种方法

    我试图弄清楚如何获取 Java pojo 并分析它的方法以获取它可以调用的所有其他方法和函数 例如 以下是输出的硬编码示例 我怎样才能使这个通用 我需要以编程方式分析 Java 对象 以确定它们在执行时可以调用哪些方法 例子 package