使用包和名称从实例获取dependecy实例

时间:2015-07-08 08:44:37

标签: java spring

假设我有实例A,其中我与实例B和C有依赖关系.B和C也有与B1和C1的依赖关系

可以使用反射和包字符串作为“B.B1”和“C.C1”从A中获取这些实例。

这就像是

          B1 b1 = A.getMagicallyTheInstance("B.B1");
          C1 c1 = A.getMagicallyTheInstance("C.C1");

2 个答案:

答案 0 :(得分:2)

您可以使用java反射或OGNL来实现。 OGNL用于对象图表符号语言及其想要使用的符号。但是如果你想使用反射,你必须遵循这些步骤。

  1. 获取A的领域
  2. 从A&#39的字段中提取B并将其作为对象。
  3. 获取B的领域
  4. 从B&#39的字段中提取B1并获取为对象。
  5. 对C和C1重复2-4。
  6. 顺便说一句getResourceAsStream用于读取类路径资源作为inputStream。据我所知,它注意到反思。

    但是在OGNL中它更简单。

    1. 使用现有对象构建上下文。就像A
    2. 的实例一样
    3. 使用此上下文执行图表表示法。要获得B1,您可以使用" a.b.b1"
    4. 之类的内容

      就是这样。

      更新

      我刚刚意识到你的Spring标签。您可以轻松地使用Spring EL实现它。这是一个例子:

          ExpressionParser parser = new SpelExpressionParser();
          Expression exp = parser.parseExpression("b.b1");
          // I Assume A has a field name b, and B has a field name b1
          B1 b1 = (B1) exp.getValue(aInsantece);
      

答案 1 :(得分:1)

根据bhdrkn的建议,OGNL可能就是这样。

但是,如果您想使用简单反射,您可以执行以下操作:

Container instance = new Container();
Class<? extends Container> klass = instance.getClass();
Field field = klass.getField("value");
String actualValue = (String) field.get(instance);

其中Container看起来像这样:

public class Container {
    public String value = "default";
}