Pico / Paranamer выбрасывает java.lang.ArrayIndexOutOfBoundsException - PullRequest
0 голосов
/ 15 января 2019

Я обнаружил, что при использовании 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
...