我想使用Reflections库来获取实现具有特定注释值的管理器的类。
我写了这样的代码:
public enum Reflection {
INSTANCE;
Reflection() {
managersRef = new Reflections("com.company.manager");
}
private final Reflections managersRef;
public Manager getManagerImplWithName(String name, Class<? extends Manager> subType) {
Set<?> managers = managersRef.getSubTypesOf(subType);
for (Object clazz : managers) {
Service serviceAnno = ((Class<?>) clazz).getAnnotation(Service.class);
if (serviceAnno != null && !StringUtils.isEmpty(serviceAnno.name()) && serviceAnno.name().equals(name))
return (Manager) clazz;
}
return null;
}
}
Manager是一个界面。 SubType是实现Manager的类,例如ProductManager / OfficeManager
我正在寻找使用注释@Service(name = name)来实现它的任何类。
这可以正常工作直到返回(经理)clazz。我明白了:
java.lang.ClassCastException: java.lang.Class cannot be cast to com.mycompany.manager.Manager
有什么问题?在检查中,我可以看到clazz的类型是实现Manager
的ProductManager答案 0 :(得分:1)
您无法将Class
对象强制转换为该类的实例。我不确定这是否真的是你想要做的,但你可以从Class
对象创建一个实例。
public Manager getManagerImplWithName(String name, Class<? extends Manager> subType) {
Set<?> managers = managersRef.getSubTypesOf(subType);
for (Object clazz : managers) {
Service serviceAnno = ((Class<?>) clazz).getAnnotation(Service.class);
if (serviceAnno != null && !StringUtils.isEmpty(serviceAnno.name()) && serviceAnno.name().equals(name))
return (Manager) ((Class<?>) clazz).newInstance();
}
return null;
}
答案 1 :(得分:0)
代表对象的Class<Manager>
实例告诉你关于类Manager
,代表管理对象的Manager
实例 - 显然,它们不一样并且不能相互投射。