以特殊格式从 JAR 中提取类名

问题描述 投票:0回答:2

如何从 Jar 文件中提取所有可用的类,并在经过一些简单处理后将输出转储到 txt 文件。

例如,如果我运行

jar tf commons-math3-3.1.6.jar
,输出的子集将是:

org/apache/commons/math3/analysis/differentiation/UnivariateVectorFunctionDifferentiator.class
org/apache/commons/math3/analysis/differentiation/FiniteDifferencesDifferentiator$2.class
org/apache/commons/math3/analysis/differentiation/SparseGradient$1.class
org/apache/commons/math3/analysis/integration/IterativeLegendreGaussIntegrator$1.class
org/apache/commons/math3/analysis/integration/gauss/LegendreHighPrecisionRuleFactory.class
org/apache/commons/math3/analysis/integration/gauss/BaseRuleFactory.class
org/apache/commons/math3/analysis/integration/gauss/HermiteRuleFactory.class
org/apache/commons/math3/analysis/integration/gauss/LegendreRuleFactory.class
org/apache/commons/math3/analysis/integration/gauss/GaussIntegratorFactory.class

我想将所有 / 转换为

以及所有 $

最后我还想删除出现在每个字符串末尾的 .class

例如:

org/apache/commons/math3/analysis/differentiation/FiniteDifferencesDifferentiator$2.class

会变成

org.apache.commons.math3.analysis.differentiation.FiniteDifferencesDifferentiator.2
java regex linux shell jar
2个回答
2
投票

在我看来,在程序中执行 shell 命令并不是很好,所以你可以做的是以编程方式检查文件。

以这个例子为例,我们将使用

/path/to/jar/file.jar.

的 jar 文件中包含的所有 Java 类的列表来填充 classNames
List<String> classNames = new ArrayList<String>();
ZipInputStream zip = new ZipInputStream(new FileInputStream("/path/to/jar/file.jar"));
for (ZipEntry entry = zip.getNextEntry(); entry != null; entry = zip.getNextEntry()) {
    if (!entry.isDirectory() && entry.getName().endsWith(".class")) {
        // This ZipEntry represents a class. Now, what class does it represent?
        String className = entry.getName().replace('/', '.').replace('$', '.');
        classNames.add(className.substring(0, className.length() - ".class".length()));
    }
}

信用:这里


1
投票
String path = "org/apache/commons/math3/analysis/integration/gauss/BaseRuleFactory.class";
path = path.replaceAll("/", ".")
           .replaceAll("\\$(\\d+)\\.class", "\\.$1");
© www.soinside.com 2019 - 2024. All rights reserved.