Slightly relaxed the rules for member injection when using a named field. In that case it is now enough to have a field that is of an assignable type, instead of requiring an exact type.
git-svn-id: https://svn.apache.org/repos/asf/felix/trunk@943089 13f79535-47bb-0310-9956-ffa450edef68
diff --git a/dependencymanager/core/src/main/java/org/apache/felix/dm/impl/ServiceImpl.java b/dependencymanager/core/src/main/java/org/apache/felix/dm/impl/ServiceImpl.java
index cd7335e..9a0d33e 100644
--- a/dependencymanager/core/src/main/java/org/apache/felix/dm/impl/ServiceImpl.java
+++ b/dependencymanager/core/src/main/java/org/apache/felix/dm/impl/ServiceImpl.java
@@ -837,16 +837,19 @@
while (serviceClazz != null) {
Field[] fields = serviceClazz.getDeclaredFields();
for (int j = 0; j < fields.length; j++) {
- if (fields[j].getType().equals(clazz) && (instanceName == null || fields[j].getName().equals(instanceName))) {
+ Field field = fields[j];
+ Class type = field.getType();
+ if ((instanceName == null && type.equals(clazz))
+ || (instanceName != null && field.getName().equals(instanceName) && type.isAssignableFrom(clazz))) {
try {
- fields[j].setAccessible(true);
+ field.setAccessible(true);
// synchronized makes sure the field is actually written to immediately
synchronized (SYNC) {
- fields[j].set(serviceInstance, instance);
+ field.set(serviceInstance, instance);
}
}
catch (Exception e) {
- m_logger.log(Logger.LOG_ERROR, "Could not set field " + fields[j], e);
+ m_logger.log(Logger.LOG_ERROR, "Could not set field " + field, e);
return;
}
}