所以我有一个设置软件包,它是扩展应用程序的基本代码。我的应用程序实现了一系列接口,然后在运行时通过弹簧注入(如配置)。我想知道是否有一种方法可以知道哪个类实现了接口被注入。我需要这个,因为我有我想要执行的JSON序列化器/反序列化器操作,但为此我需要知道注入的类。如何知道哪个bean被注入界面?
我有一个java配置文件,将描述接线,它将提供游戏实现。但到目前为止,我还没有能够获得实现接口的具体类。我也没有成功从上下文中请求这些信息。
蚂蚁提示?
所以我有一个设置软件包,它是扩展应用程序的基本代码。我的应用程序实现了一系列接口,然后在运行时通过弹簧注入(如配置)。我想知道是否有一种方法可以知道哪个类实现了接口被注入。我需要这个,因为我有我想要执行的JSON序列化器/反序列化器操作,但为此我需要知道注入的类。如何知道哪个bean被注入界面?
我有一个java配置文件,将描述接线,它将提供游戏实现。但到目前为止,我还没有能够获得实现接口的具体类。我也没有成功从上下文中请求这些信息。
蚂蚁提示?
所以我围绕这个问题的方式是通过向JSON反序列化器中注入对象并使用getClass()方法作为模板给Jackson使用。它的功能就像一个魅力,甚至认为被注入的实现被注入到依赖中发生的布线中!希望能帮助到你!
您可以使用反射让注入的实例告诉您它是什么实现类:injectedInstance.getClass().getName()
。但是,除非你做了一些特别的事情,否则认为这是一种破解。您可能应该重新访问您的设计,以免不必这样做。
确实,我认为这将是我解决这个设计问题时的部分解决方案。谢谢! – jfzr
你可以简单地自动装配的接口,并得到实现的类名:
@Autowired
private Service service;
System.out.println(service.getClass().getName());
同春豆
但是Spring容器已通常代理他们,所以它并不总是有益的,在课堂上面的例子是一个春天类叫做:
hello.HelloServiceImpl$$EnhancerBySpringCGLIB$$ad2e225d
我怀疑你应该看看杰克逊串行应该处理这一切,看到Java - Jackson Annotations to handle no suitable constructor
如果你能得到的话,接口的目的就会丢失,对吗? – DNAj
@DNAj我明白你的观点,但除此之外,我无法处理JSON转换(杰克逊),因为我使用的POJO包含应该由我的应用实现的接口。可以肯定的是,这里有一个设计问题,但是我不知道如何在不知道实现的类的情况下解决它。 – jfzr
嗨@jfzr,那么你只有选择反射。通过正确使用反射,您还可以更改访问修饰符并使其可访问。让我知道你是否需要更多的信息。 – DNAj