Получить файл JAR из пути и изменить имена его классов - PullRequest
0 голосов
/ 25 марта 2019

Поэтому мне нужно создать консольное приложение 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;
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...