Java 从具有包和名称的实例获取dependecy实例

Java 从具有包和名称的实例获取dependecy实例,java,spring,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"); 您可以使用java反射或。OGNL是对象图表示法语言及其表示法,就像您想要使用的一样。但是如果你想使用反射,你必须遵循以下步骤 得到一

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

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

大概是

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

您可以使用java反射或。OGNL是对象图表示法语言及其表示法,就像您想要使用的一样。但是如果你想使用反射,你必须遵循以下步骤

  • 得到一个
  • 从A的字段中提取B并将其作为对象
  • 获取B的字段
  • 从B的字段中提取B1,并将其作为对象获取
  • 对C和C1重复2-4
  • 顺便说一下,
    getResourceAsStream
    用于将类路径资源作为inputStream读取。据我所知,它没有任何反映

    但在OGNL中要简单得多

  • 使用现有对象构建上下文。像
    A的一个实例
  • 使用此上下文执行图形表示法。对于get B1,您可以使用类似“a.b.B1”的内容
  • 就这些

    更新 我才意识到你的弹簧标签。您可以使用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);
    

    正如bhdrkn所建议的那样,OGNL可能是一条出路

    但是,如果要使用纯反射,可以执行以下操作:

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

    我修改了解释,我希望实例而不是类创建一个新实例。我认为bhdrkn的答案可能就是您想要的。