/** * Метод служит для инъекции одного объекта в соответствующие поля другого. * Все поля, которые могут принять этот объект да заполнятся им (окромя Object). * @param object Кого укалываем. * @param injectible Что вводим. * @return вернули то, что дали на вход (удобства ради). */ <T> T injectAll(T object, Object injectible);Если надо это чудо - читаем дальше...
package utils; import java.lang.reflect.Field; public final class Injector { /** * Метод служит для инъекции одного объекта в соответствующие поля другого. * Все поля, которые могут принять этот объект да заполнятся им (окромя Object). * @param object Кого укалываем. * @param injectible Что вводим. * @return вернули то, что дали на вход (удобства ради). */ public static <T> T injectAll(T object, Object injectible) { final Field[] declaredFields = object.getClass().getDeclaredFields(); final Class injectibleClass = injectible.getClass(); boolean injected = false; for (Field field : declaredFields) { if (Object.class.equals(field.getType())) { continue; } if (!field.getType().isAssignableFrom(injectibleClass)) { continue; } field.setAccessible(true); try { field.set(object, injectible); } catch (IllegalArgumentException e) { throw new IllegalArgumentException("Неудача, по причине:", e); } catch (IllegalAccessException e) { throw new IllegalArgumentException("Неудача, по причине:", e); } field.setAccessible(false); injected = true; } if (!injected) { throw new IllegalArgumentException("В исходном объекте не нашлось ни одного поля по образу и подобию."); } return object; } }Аминь!..
Кто не верует, вот тест чудотворный
package test.utils; import static org.junit.Assert.*; import org.junit.Test; import utils.Injector; public class InjectorTest { class Injectable { } class FieldWithSameClass { private Injectable object = null; } @Test public void testInjectObjectInTheFieldWithSameClass() { assertNotNull(Injector.injectAll(new FieldWithSameClass(), new Injectable()).object); } class FieldsWithSameClass { private Injectable object1 = null; private Injectable object2 = null; } @Test public void testMultipleInjectionInTheFieldsWithSameClass() { final Injectable injectable = new Injectable(); FieldsWithSameClass source = Injector.injectAll(new FieldsWithSameClass(), injectable); assertNotNull(source.object1); assertNotNull(source.object2); assertSame(injectable, source.object1); assertSame(source.object1, source.object2); } class InjectableWithInterface implements InjectableI { } interface InjectableI { } class FieldWithClassImplementsInterface { private InjectableWithInterface object = null; } @Test public void testInjectObjectInTheFieldWithClassImplementsInterface() { assertNotNull(Injector.injectAll(new FieldWithClassImplementsInterface(), new InjectableWithInterface()).object); } class FieldWithInterface { private InjectableI object = null; } @Test public void testInjectObjectInTheFieldWithInterface() { final InjectableI injectable = new InjectableWithInterface(); assertNotNull(Injector.injectAll(new FieldWithInterface(), injectable).object); } class InjectableParent { } class InjectableChild extends InjectableParent { } class FieldWithExtends { private InjectableParent object = null; } @Test public void testInjectObjectInTheFieldWithExtends_injectChild() { assertNotNull(Injector.injectAll(new FieldWithExtends(), new InjectableChild()).object); } @Test public void testInjectObjectInTheFieldWithExtends_injectParent() { assertNotNull(Injector.injectAll(new FieldWithExtends(), new InjectableParent()).object); } class FieldWithObject { private Object object1; private Injectable object2; } @Test public void testNoObjectInjection() { final FieldWithObject source = Injector.injectAll(new FieldWithObject(), new Injectable()); assertNull(source.object1); assertNotNull(source.object2); } class FieldWithObjectOnly { private Object object; } @Test public void testNoInjectionExceptionIfObjectPresent() { try { Injector.injectAll(new FieldWithObjectOnly(), new Injectable()); fail("Бес попутал, должон быть exception"); } catch (IllegalArgumentException e) { assertEquals("В исходном объекте не нашлось ни одного поля по образу и подобию.", e.getMessage()); } } class FieldWithoutObjects { } @Test public void testNoInjectionExceptionIfNoObjects() { try { Injector.injectAll(new FieldWithoutObjects(), new Injectable()); fail("Бес попутал, должон быть exception"); } catch (IllegalArgumentException e) { assertEquals("В исходном объекте не нашлось ни одного поля по образу и подобию.", e.getMessage()); } } }
А мож таки правильней:
ОтветитьУдалитьif ( ! Object.class.equals(field.getType()) ) {
continue;
}
а то как то без "!" ведь будет пропускать именно нужные поля.
Или я не понял задумки партии и правительства ?
Посмотрите, пожалуйста тест testNoObjectInjection - там описана задумка.
ОтветитьУдалитьСаш, можно исходники, плз?
ОтветитьУдалитьТак жеж все обадвое класса в посте. Я не уверен что найду сейчас его. Плиз скопируй их и если что не так, и не получается исправить - пиши, буду искать
Удалить