Я обнаружил, что при использовании Pico (picocontainer) 2.14.3 на Java (jdk1.8.0_141); использование
Characteristics.USE_NAME для внедрения в конструктор зависимостей заставляет Paranamer 2.8 генерировать следующее исключение [1] только в том случае, если в конструкторе [2] есть лямбда-ссылка, при комментировании лямбда-ссылки в конструкторе инъекция зависимостей работает [3] , Это известная проблема? если так, у нас есть обходной путь для этого.
Это может быть воссоздано с использованием следующего:
[1] Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 19562
at org.picocontainer.paranamer.BytecodeReadingParanamer$ClassReader.accept(BytecodeReadingParanamer.java:562)
at org.picocontainer.paranamer.BytecodeReadingParanamer$ClassReader.access$200(BytecodeReadingParanamer.java:337)
at org.picocontainer.paranamer.BytecodeReadingParanamer.lookupParameterNames(BytecodeReadingParanamer.java:102)
at org.picocontainer.paranamer.AdaptiveParanamer.lookupParameterNames(AdaptiveParanamer.java:75)
at org.picocontainer.paranamer.AnnotationParanamer.lookupParameterNames(AnnotationParanamer.java:110)
at org.picocontainer.paranamer.CachingParanamer.lookupParameterNames(CachingParanamer.java:75)
at org.picocontainer.injectors.ParameterNameBinding.getName(ParameterNameBinding.java:38)
at org.picocontainer.injectors.ConstructorInjector.getGreediestSatisfiableConstructor(ConstructorInjector.java:149)
at org.picocontainer.injectors.ConstructorInjector.getGreediestSatisfiableConstructor(ConstructorInjector.java:110)
at org.picocontainer.injectors.ConstructorInjector.access$100(ConstructorInjector.java:51)
at org.picocontainer.injectors.ConstructorInjector$1.run(ConstructorInjector.java:331)
at org.picocontainer.injectors.AbstractInjector$ThreadLocalCyclicDependencyGuard.observe(AbstractInjector.java:270)
at org.picocontainer.injectors.ConstructorInjector.getComponentInstance(ConstructorInjector.java:364)
Моя грубая реализация:
public class PicoTest {
public static void main(String[] args) {
final MutablePicoContainer pico = new PicoBuilder(new EmptyPicoContainer())
.withConstructorInjection()
.withNamedFieldInjection()
.withCaching()
.build();
pico.addComponent("first", "First");
pico.addComponent("second", "Second");
pico.addComponent("third", "Third");
pico.as(Characteristics.USE_NAMES).addComponent(MyPicoImpl.class);
System.out.println(pico.getComponent(MyPicoImpl.class));
}
[2] //Lambda reference in constructor causes this to happen.
public class MyPicoImpl {
private final String first;
private final String second;
private String third;
public MyPicoImpl(String first, String second, String third) {
this.first = first;
this.second = second;
this.third = third;
Runnable r = () -> {
System.out.println("Gamble ....");
};
System.out.println(String.format("Received 1 %s 2 %s 3 %s ", this.first, this.second, this.third));
}
Комментируя лямбда-ссылку, я получаю ожидаемый результат [3]
public class MyPicoImpl {
private final String first;
private final String second;
private String third;
public MyPicoImpl(String first, String second, String third) {
this.first = first;
this.second = second;
this.third = third;
/* Runnable r = () -> {
System.out.println("Gamble ....");
}; */
System.out.println(String.format("Received 1 %s 2 %s 3 %s ", this.first, this.second, this.third));
}
}
}
[3] Ожидаемый результат:
Received 1 First 2 Second 3 Third
com.company.MyPicoImpl@46ee7fe8