如何从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
答案 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.
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