[weld-dev] inner classes and param types

Ales Justin ales.justin at gmail.com
Fri Mar 2 11:29:28 EST 2012


One way of solving this ...

                Type parameterType;
                if (parameterTypes.length == genericParameterTypes.length) {
                    parameterType = genericParameterTypes[i];
                } else {
                    if (gi >= 0)
                        parameterType = genericParameterTypes[gi];
                    else
                        parameterType = parameterTypes[i];
                }

... but I would still like to know where does the diff comes from.

On Mar 2, 2012, at 5:10 PM, Ales Justin wrote:

> Anyone seen this, or how to make this deterministic ...
> 
> I have these 2 classes - (a) and (b) - see below.
> And this code:
> 
>            final Annotation[][] parameterAnnotations = constructor.getParameterAnnotations();
>            final Type[] genericParameterTypes = constructor.getGenericParameterTypes();
>            // If the class is a (non-static) member class, its constructors
>            // parameterTypes array will prefix the
>            // outer class instance, whilst the genericParameterTypes array isn't
>            // prefix'd -- not always true ...
>            int nesting = Reflections.getNesting(declaringClass.getJavaClass());
>            for (int i = 0; i < parameterTypes.length; i++) {
>                int gi = i - nesting;
> 
>                Annotation[] annotations = (gi >= 0 && parameterAnnotations[gi].length > 0) ? parameterAnnotations[gi] : EMPTY;
>                Class<?> clazz = parameterTypes[i];
>                Type parameterType = genericParameterTypes[i];
> 
> So, the issue is - as I added "not always true" to the existing comment,
> that "genericParameterTypes" are random in my case -- 
> sometimes they have owner class prefixed == use case (a), 
> sometimes they don't == use case (b), hence resulting in ArrayIOOBE.
> 
> Any idea why is this so?
> 
> -Ales
> 
> ---
> 
> (a)
> 
> public class Crasher {
>    protected class NonStaticInner {
>        public NonStaticInner(@Nonnull Integer a) {
>            System.out.println("Hi" + a);
>        }
> 
>        protected class NonStaticInner2 {
>            public NonStaticInner2(@Nonnull Double a) {
>                System.out.println("Hi" + a);
>            }
>        }
>    }
> }
> 
> (b)
> 
> public class ExampleTest {
> 
>    ...
> 
>    public class NonContextual<T> {
> 
>        final InjectionTarget<T> it;
>        final BeanManager manager;
> 
>        public NonContextual(BeanManager manager, Class<T> clazz) {
>            this.manager = manager;
>            AnnotatedType<T> type = manager.createAnnotatedType(clazz);
>            this.it = manager.createInjectionTarget(type);
>        }
> 
>        public CreationalContext<T> postConstruct(T instance) {
>            CreationalContext<T> cc = manager.createCreationalContext(null);
>            it.inject(instance, cc);
>            it.postConstruct(instance);
>            return cc;
>        }
> 
>        public void preDestroy(T instance) {
>            it.preDestroy(instance);
>        }
>    }
> }
> 




More information about the weld-dev mailing list