从路径获取一个jar文件,并更改其类名

时间:2019-03-25 16:35:14

标签: java file

因此,我需要制作一个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;
    }

0 个答案:

没有答案