因此,我需要制作一个Java控制台应用程序,该应用程序将获取jar文件路径并将所有类名打印到控制台。
然后,我希望它将所有类名都从abc“ ABC”(例如)更改为3个随机字母,然后我需要它来创建一个新的jar文件,其类中的代码相同,但新类名。
现在我的想法是存储类代码 ArrayList>这样,每个索引将代表一个类,而ArrayList的每个索引将代表该类中的一行
如果您可以获得字节码并将其传输到正在创建的新文件中,也许也不需要反编译器
现在我对使用Java和C#这样的文件确实没有太多的经验,虽然我曾经使用过几次文件,但是还没有达到这个水平,但是我很乐于学习,我也理解这可能是用旧的代码创建一个新的jar很麻烦
我希望这里有一种有效的短途方法来完成我需要的事情
而且,我现在不需要这是一个大项目,这就是为什么我在一堂课上做所有事情
这就是我现在得到的
private static ArrayList<String> usedNames;
private static final String letters = "abcdefghijklmnopqrstuvwxyz";
private static Random rnd;
public static void main(String args[]) throws Exception
{
usedNames = new ArrayList<String>();
usedNames.add("");
rnd = new Random();
// reading
BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
System.out.println("Enter a jar path: ");
String inputPath = reader.readLine();
System.out.println("Enter a output path: ");
String outputPath = reader.readLine();
// getting all class names from jar
List<String> classNames = new ArrayList<String>();
ZipInputStream zip = new ZipInputStream(new FileInputStream(inputPath + ".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('/', '.'); // including ".class"
classNames.add(className.substring(0, className.length() - ".class".length()));
}
}
// print all classes names
for (String s : classNames)
System.out.println(s);
// getting the code of each class to some sort of data structure
// changing classes names to random letters
// creating a new jar file with the classes in location outputPath
}
private static String getRandomClassName() {
String str = "";
while (usedNames.contains(str)) {
for (int i = 0; i < 3; i++)
str += letters.charAt(rnd.nextInt(27));
}
usedNames.add(str);
return str;
}