jar ファイルの URL リストと、 のようなパス全体のクラス名がcom.mycompany.myproject.Test
あります。これらの jar ファイルを検索して、その中の .class ファイルを取得するにはどうすればよいですか? 逆コンパイルに使用します。
String classname = "com.mycompany.myproject.Test";
URI uri = Tool.searchClass(jarList, classname);
// decompile .class
...
このようなサンプルコードはありますか?
追加: シェル スクリプトは優れていますが、Java コードでこの作業を行う方法はありますか?
追加:これを処理するために使用して静的メソッドを作成java.util.jar.JarFile
しました。これが他の人に役立つことを願っています
次のコードはテスト済みで、正しく動作します。
/**
* Search the class by classname specified in jarFile, if found and destFolder specified
* Copy the .class file into destFolder with whole path.
* @param classname
* @param jarFile
* @param destFolder
* @return
*/
public static File searchCompressedFile(String classname, File jarFile, String destFolder) {
try {
// change classname "." to "/"
if(classname.contains(".")){
classname = classname.replace(".", "/");
}
JarFile jarF = new JarFile(jarFile);
Enumeration<JarEntry> jarEntries = jarF.entries();
while (jarEntries.hasMoreElements()) {
JarEntry jarEntry = jarEntries.nextElement();
if (jarEntry.getName().indexOf(classname) >= 0) {
String filePath = jarFile.getAbsolutePath();
System.out.println(classname + " is in " + filePath + "--" + jarEntry.getName());
if (destFolder != null && !"".equals(destFolder)) {
// Make folder if dest folder not existed.
File destF = new File(destFolder);
if (!destF.exists()) {
destF.mkdirs();
}
File f = new File(destFolder + File.separator + jarEntry.getName());
if(!f.getParentFile().exists()){
f.getParentFile().mkdirs();
}
InputStream is = jarF.getInputStream(jarEntry);
FileOutputStream fos = new java.io.FileOutputStream(f);
while (is.available() > 0) {
fos.write(is.read());
}
fos.close();
is.close();
return f;
}
}
}
} catch (IOException e) {
e.printStackTrace();
}
System.out.println("Class not found in jar");
return null;
}