Джава. Как получить весь экземпляр (не класс) подкласса с отражением? - PullRequest
0 голосов
/ 17 января 2019

Конечно, у меня есть некоторые исследования, такие как сканирование пакетов, отражение java, gson и т. Д.

Что я хочу?

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

Итак, у каждого подкласса должен быть метод с именем вроде SuperClass nextInstance(). Если я получаю список подклассов, скажем classes, по отражению, мне просто нужно вызвать nextInstance для каждого элемента в classes.

Это просто будет сделано.

Но мне нужно добавить статический метод для каждого подкласса, и имя должно быть nextInstance, очень глупо !!!

Почему я хочу это сделать.

Есть огромный тестовый проект, который мне нужно запустить. И у каждого подкласса есть свои параметры (это случайно). Я хочу скрыть настройки параметров. Сотруднику не нужно заботиться о параметрах. Им просто нужно заботиться о своем собственном коде. Я думаю, что единственный способ реализовать это - расширить метод из суперкласса.

Чем я занимаюсь.

  • Создать фабричный класс для каждого из них ( слишком хлопотно ).
  • Добавление пути подкласса в список для загрузки их во время выполнения ( Сложно поддерживать ).
  • Попробуйте абстрактный статический метод с помощью отражения (невозможно в Java).
  • И так далее (может быть, я откажусь)

Пример

    Abstract class SuperClass{
        // I know it is impossible in java, but just explain what I mean.
        public static abstract SuperClass nextInstance();
    }
    class SubClassA extend SuperClass{
        private double params;
        public SuperClass(double parmas){
            this.params = params;
        }
        public static SuperClass nextInstance(){
            return new SubClassA(r.nextDouble()+4);
        }
    }
    class SubClassB extend SuperClass{
        private int params;
        public SuperClass(int parmas){
            this.params = params;
        }
        public static SuperClass nextInstance(){
            return new SubClassB(r.nextInt(20)+4);
        }
    }
    class Main{
        public static void main(String[] args){
            List<Class> classes.....// get classes extend from SuperClass by reflection.
            List<SuperClass> res = new ArrayList<>();
            for(Class c:classes){
                res.add(c.nextInstance())
            }
            // do something on each element in res.
        }
    }

Обновление

Я думаю, мне нужно проще объяснить, что я хочу сделать. Если там кто-то использовал slfj LoggerFactory.getLogger(Class c), это будет легче понять. Для меня мне нужно реализовать метод, подобный Factory.getInstance(Class c), и код этого метода вызовет c.nextInstance ();

Есть предложения по этому поводу?

1 Ответ

0 голосов
/ 29 января 2019

Хорошо, поэтому вы не можете объявить свой метод "public static abstract" в суперклассе, но вы можете сказать своим коллегам просто включить метод, который "public static" возвращает SuperClass и не принимает аргументов, а затем найти этот метод отражается на вашей фабрике:

public static class Main {
    public static void main(String[] args) {
        List<Class> classes.....// get classes extend from SuperClass by reflection.
        List<SuperClass> res = new ArrayList<>();
        for (Class<?> clazz : classes) {
            for (Method method : clazz.getMethods()) {
                if (isStatic(method) && returnsSuperClass(method) && hasNoParameters(method)) {
                    res.add((SuperClass) method.invoke(null));
                }
            }
        }
    }

    public static boolean hasNoParameters(Method method) {
        return method.getParameterTypes().length == 0;
    }

    public static boolean returnsSuperClass(Method method) {
        return SuperClass.class.isAssignableFrom(method.getReturnType());
    }

    public static boolean isStatic(Method method) {
        return (method.getModifiers() & Modifier.STATIC) == Modifier.STATIC;
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...