Поэтому мне нужно создать консольное приложение java, которое получает путь к файлу jar и печатает все имена классов в консоли.
Затем я хочу изменить имена всех классов на 3 случайные буквы из азбуки "ABC" (например), а затем мне нужно создать новый файл jar с тем же кодом в классах, но с новым имена классов.
Теперь моя идея для хранения кода классов
ArrayList> таким образом, каждый индекс будет представлять класс, а каждый индекс ArrayList будет представлять строку в этом классе
также, возможно, вам не понадобится декомпилятор, если вы можете получить байт-код и просто перенести его в новый создаваемый файл
Сейчас у меня нет особого опыта работы с такими файлами в Java и в C #. Я работал с файлами несколько раз, но не на этом уровне, но я был бы рад узнать, я также понимаю, что это может быть проблематично просто создать новую банку с кодом старой
Я надеюсь, что есть короткий эффективный способ сделать то, что мне нужно здесь
Кроме того, мне сейчас не нужно, чтобы это был большой проект, и поэтому я делаю все в одном классе
вот что я получил прямо сейчас
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;
}