java .lang.StringIndexOutOfBoundsException: строковый индекс вне диапазона при изменении имени пакета - PullRequest
0 голосов
/ 29 апреля 2020

Я хочу прочитать аннотации из файла .class, помещенного в случайную папку. Я попробовал это:

            public static void main(String[] args) throws Exception
            {    
                final File folder = new File("/opt/test");
                processAnnotatedFiles(listLocalFilesAndDirsAllLevels(folder));

            }

        public void processAnnotatedFiles(List<File> list) throws IOException, ClassNotFoundException {
            out.println("Directory files size " + list.size());

            for(int i=0; i<list.size(); i++) {
                out.println("File " + list.get(i).getName());

                File file = list.get(i);

                String path = file.getPath();

                String[] authors = getFixFromClassFile(Paths.get(path));
                System.out.println(Arrays.toString(authors));
            }

        }

        public List<File> listLocalFilesAndDirsAllLevels(File baseDir) {

            List<File>  collectedFilesAndDirs = new ArrayList<>();
            Deque<File> remainingDirs = new ArrayDeque<>();

            if(baseDir.exists()) {
                remainingDirs.add(baseDir);

                while(!remainingDirs.isEmpty()) {
                    File dir = remainingDirs.removeLast();
                    List<File> filesInDir = Arrays.asList(dir.listFiles());
                    for(File fileOrDir : filesInDir)  {
                        // We need to process only .class files
                        if(fileOrDir.getName().endsWith(".class")){
                            collectedFilesAndDirs.add(fileOrDir);
                            if(fileOrDir.isDirectory()) {
                                remainingDirs.add(fileOrDir);
                            }
                        }
                    }
                }
            }

            return collectedFilesAndDirs;
        }

        private String[] getFixFromClassFile(Path pathToClass) throws MalformedURLException, ClassNotFoundException {
            // Create class loader based on path
            URLClassLoader loader = new URLClassLoader(new URL[]{pathToClass.toUri().toURL()});

            // convert path to class with package
            String classWithPackage = getClassWithPackageFromPath(pathToClass);

            // Load class dynamically
            Class<?> clazz = loader.loadClass(classWithPackage);
            Fix fix = clazz.getAnnotation(Fix.class);
            if (fix == null) {
                return new String[0];
            }

            return fix.author();
        }

        private String getClassWithPackageFromPath(Path pathToClass) {
            final String packageStartsFrom = "com.";
            final String classFileExtension = ".class";
            final String pathWithDots = pathToClass.toString().replace(File.separator, ".");
            return pathWithDots.substring(pathWithDots.indexOf(packageStartsFrom)).replace(classFileExtension, "");
        }

Я получаю java.lang.StringIndexOutOfBoundsException: String index out of range: -1 at java.lang.String.substring(String.java:1927)

В этой части я хочу создать пакет в случайный каталог. Действительно трудно создать действительный пакет по пути, потому что не должно следовать ни одного имени пакета правил.

Можете ли вы дать мне несколько советов, как это можно исправить?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...