使用特殊格式从JAR中提取类名

时间:2016-10-15 16:32:51

标签: java regex linux shell jar

如何从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

2 个答案:

答案 0 :(得分:2)

String path = "org/apache/commons/math3/analysis/integration/gauss/BaseRuleFactory.class";
path = path.replaceAll("/", ".")
           .replaceAll("\\$(\\d+)\\.class", "\\.$1");

答案 1 :(得分:1)

在我看来,在程序中执行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('$',''); // including ".class"
        classNames.add(className.substring(0, className.length() - ".class".length()));
    }
}

信用:Here