【问题标题】:Java: Factory method with reflection?Java:带反射的工厂方法?
【发布时间】:2011-11-04 17:38:18
【问题描述】:

我的工厂类有一个类的集合,我不想要那种依赖,当我添加 SuperClass 的子类时,我需要工厂文件保持不变

编辑: 我的工厂类必须返回所有超类的子类实例,但我不能拥有它们(或它们的名称)的集合,因为这意味着每当我添加新的子类时,我都必须更改工厂文件!

package reflection;

public final class Factory {

    private final SuperClass[] subclasses_collection 
            = {new SubClass1(), new SubClass2() /* ...SubClassN */};

    public final SuperClass[] getAllSubClasses() {
        return subclasses_collection;
    }
}

【问题讨论】:

  • 这堂课不是食堂。还有……有什么问题?
  • @JB Nizet 我想他想知道如何在运行时(通过反射)找到给定类的所有子类。
  • 我认为 OP 只是想用反射创建实例。我还认为 OP 会知道要实例化的类的名称。

标签: java reflection factory factory-pattern


【解决方案1】:

而不是

new SubClass1()

做这样的事情

Class clazz = Class.forName("SubClass1");
Object subclass1 = clazz.newInstance();

如果您想将参数传递给构造函数,请参阅这篇文章,创建新对象部分 http://java.sun.com/developer/technicalArticles/ALT/Reflection/

【讨论】:

  • 不,我不想修改工厂类,如果我添加一个子类,我仍然需要更改工厂类
  • 不,您不必这样做。您可以在创建子类时将子类的名称(字符串)传递给工厂,或者工厂可以从属性文件(文本文件)中读取它。
【解决方案2】:

要查找给定类的所有子类,我会查看this java world 站点。它通过一个包,加载类,并测试它们以查看是否有任何子类。

【讨论】:

    【解决方案3】:

    如果你想搜索一个类的所有子类,你可以使用反射,正如 Jeffrey 所说。但是,我不会自己编写代码来执行此操作,或者从一些随机文章中复制并粘贴它,而是使用Stripes web framework 中的ResolverUtil,这正是您想要的(以及更多!)。

    类路径扫描的替代方法是在运行时建立一个注册表。你可以像这样创建一个基类:

    public abstract class SuperClass {
        private static final Set<Class<? extends SuperClass>> SUB_CLASSES = new HashSet<Class<? extends SuperClass>>();
    
        /* instance initializer */ {
            SUB_CLASSES.put(getClass());
        }
    }
    

    被实例化的每个子类都会将自己添加到子类集合中。然后,您的工厂可以使用该套件。您所要做的就是确保所有子类都在某个时候被实例化 - 可能使用配置文件,或者通过系统其他部分的启动操作。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-06-30
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多