【问题标题】:Java. How to get all instance(not class) of subclass with reflected?爪哇。如何通过反射获取子类的所有实例(不是类)?
【发布时间】:2019-06-11 19:30:46
【问题描述】:

当然,我做过一些研究,比如包扫描、java 的反射、gson 等等。

我想要什么?

我想随机获取一些实例,但将此部分代码保留在子类中。

因此,每个子类都应该有一个名为SuperClass nextInstance() 的方法。 如果我通过反射得到子类列表,比如classes,我只需要为classes 中的每个元素调用nextInstance。

刚刚完成。

但是,我需要为每个子类添加静态方法,并且名称必须是nextInstance,真是愚蠢!!!

我为什么要这样做。

我需要运行一个庞大的测试项目。 每个子类都有自己的参数(它是随机的)。 我想隐藏参数设置。 同事不需要关心参数是什么。 他们只需要关心自己的代码。 我认为实现它的唯一方法是从 superClass 扩展一个方法。

我已经做了什么。

  • 为每个人创建一个工厂类(太麻烦)。
  • 在 List 中添加子类路径以在运行时加载它们(难以维护)。
  • 通过反射尝试抽象静态方法(在 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.
        }
    }

更新

我认为我需要更简单地重新解释我想要做什么。 如果有人用过slfjLoggerFactory.getLogger(Class c),那就更容易理解了。 对我来说,我需要实现一个类似Factory.getInstance(Class c)的方法,这个方法中的代码会调用c.nextInstance();

有什么建议吗?

【问题讨论】:

  • 从你目前的情况退后一步,首先请解释你想要达到的目标。你想对一个类的每个实例做什么?
  • @Lino 已经更新
  • 能否提供minimal reproducible example。目前还不清楚您要实现的目标
  • 不要在src/main/java 中的类中构建测试方法,而是将测试内容放在src/test/java 中并将其应用到您的类中。除此之外,很难理解您要做什么。
  • @Lino Emmm... 清楚吗?

标签: java reflection package


【解决方案1】:

好的,所以你不能在超类中声明你的“公共静态抽象”方法,但你可以告诉你的同事只包含一个“公共静态”方法返回一个超类并且不接受任何参数,然后找到通过在您的工厂中反射该方法:

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;
    }
}

【讨论】:

  • 是的,这正是我所做的,只是有点不高兴。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-07-10
  • 1970-01-01
  • 1970-01-01
  • 2016-10-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多