gpt4 book ai didi

java - 查找 Java 类中的所有依赖项

转载 作者:搜寻专家 更新时间:2023-11-01 02:11:52 29 4
gpt4 key购买 nike

我正在尝试获取 Java 类中的所有依赖项,包括用于泛型参数化和局部变量类型的类。到目前为止,我发现的最好的框架是 apache bcel .使用它我可以轻松地从字节码中找到所有字段、方法参数和局部变量。基本上除了泛型和局部变量类型之外的所有东西。例如,来自 List<Point> points = new ArrayList<Point>(); 行我只能找到一个依赖项 - ArrayList 使用 JavaClass.getConstantPool()来自 bcel 的方法。它既不能检测到 List 接口(interface),也不能检测到 Point 类。我也试过tattletale和 CDA,不幸的是没有成功(同样的结果)。检查导入是不够的——我还需要来自同一个包的依赖项,我不能接受通配符。如果有任何帮助,我将不胜感激。

最佳答案

我终于找到了解决方案。 ASM Bytecode Framework 是正确的工具。使用官方tutorial和对example获取所有需要的依赖项非常容易。在示例中,已经有一个访问者类 DependencyVisitor 可以执行我想要的操作。为了获得正确的格式,我只需要更改 DependencyVistitor 示例代码中的一个方法,因此它会添加完整的类名而不是仅添加包:

private String getGroupKey(String name)
{
//Just comment that block so you can get full class names instead of package only
/*
int n = name.lastIndexOf('/');
if (n > -1)
{
name = name.substring(0, n);
}
*/
// Replace resource char with package separator char
packages.add(name.replace("/", "."));
//packages.add(name);
return name;
}

查看 DependencyVisitor 代码,您可以轻松理解它的作用并根据您的需要对其进行修改。在我的示例类上运行它会给我很好、有用的输出:[java.util.ArrayList, java.lang.Object, java.util.List, java.awt.Point, goobar.test.asmhello.TestClass, java.lang.String, java.lang.Integer, java. awt.Graphics,goobar.test.asmhello.TestClass2]。它包含我使用过的每个类和接口(interface)以及用于泛型参数化的每个类型。

关于java - 查找 Java 类中的所有依赖项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17371748/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com