public static boolean isMethodInInterface(final MetaClass iface, final MetaMethod member) { if (iface.getMethod(member.getName(), Arrays.stream(member.getParameters()).map(p -> p.getType()).toArray(MetaClass[]::new)) != null) return true; return false; }
@Override public MetaClassMember getBindingMember() { if (writingMember != null) { return writingMember; } MetaMethod meth = toMap.getMethod(getterMethod, targetType); final Method method = meth.asMethod(); if (method != null) { method.setAccessible(true); } writingMember = meth; if (writingMember == null) { throw new RuntimeException("no such setter method: " + toMap.getFullyQualifiedName() + "." + getterMethod); } return writingMember; }
@Override public MetaClassMember getReadingMember() { if (readingMember != null) { return readingMember; } MetaMethod meth = toMap.getMethod(getterMethod, new MetaClass[0]); final Method method = meth.asMethod(); if (method != null) { method.setAccessible(true); } readingMember = meth; if (readingMember == null) { throw new RuntimeException("no such getter method: " + toMap.getFullyQualifiedName() + "." + getterMethod); } return readingMember; }
@Override public MetaClassMember getReadingMember() { if (readingMember != null) { return readingMember; } final MetaMethod meth = toMap.getMethod(getterMethod, new MetaClass[0]); final Method method = meth.asMethod(); if (method != null) { method.setAccessible(true); } readingMember = meth; if (readingMember == null) { throw new RuntimeException("no such getter method: " + toMap.getFullyQualifiedName() + "." + getterMethod); } return readingMember; }
private MetaClass getValueType(final MetaClass type) { if (type.isAssignableTo(TakesValue.class)) { return type.getMethod("getValue", new Class[0]).getReturnType(); } else { return null; } }
@Override public MetaClassMember getBindingMember() { if (bindingMember != null) { return bindingMember; } MetaMethod meth = toMap.getMethod(setterMethod, targetType); final Method method = meth.asMethod(); if (method != null) { method.setAccessible(true); } bindingMember = meth; if (bindingMember == null) { throw new RuntimeException("no such setter method: " + toMap.getFullyQualifiedName() + "." + setterMethod); } return bindingMember; }
@Override public MetaClassMember getReadingMember() { if (readingMember != null) { return readingMember; } final MetaMethod meth = toMap.getMethod(getterMethod, new MetaClass[0]); final Method method = meth.asMethod(); if (method != null) { method.setAccessible(true); } readingMember = meth; if (readingMember == null) { throw new RuntimeException("no such getter method: " + toMap.getFullyQualifiedName() + "." + getterMethod); } return readingMember; }
public static boolean isMethodInInterface(final MetaClass iface, final MetaMethod member) { if (iface.getMethod(member.getName(), Arrays.stream(member.getParameters()).map(p -> p.getType()).toArray(MetaClass[]::new)) != null) return true; return false; }
@Override public MetaClassMember getBindingMember() { if (bindingMember != null) { return bindingMember; } MetaMethod meth = toMap.getMethod(setterMethod, targetType); final Method method = meth.asMethod(); if (method != null) { method.setAccessible(true); } bindingMember = meth; if (bindingMember == null) { throw new RuntimeException("no such setter method: " + toMap.getFullyQualifiedName() + "." + setterMethod); } return bindingMember; }
@Override public MetaClassMember getReadingMember() { if (readingMember != null) { return readingMember; } MetaMethod meth = toMap.getMethod(getterMethod, new MetaClass[0]); final Method method = meth.asMethod(); if (method != null) { method.setAccessible(true); } readingMember = meth; if (readingMember == null) { throw new RuntimeException("no such getter method: " + toMap.getFullyQualifiedName() + "." + getterMethod); } return readingMember; }
@Override public MetaClassMember getBindingMember() { if (writingMember != null) { return writingMember; } MetaMethod meth = toMap.getMethod(getterMethod, targetType); final Method method = meth.asMethod(); if (method != null) { method.setAccessible(true); } writingMember = meth; if (writingMember == null) { throw new RuntimeException("no such setter method: " + toMap.getFullyQualifiedName() + "." + getterMethod); } return writingMember; }
private MetaClass getValueType(final MetaClass type) { if (type.isAssignableTo(TakesValue.class)) { return type.getMethod("getValue", new Class[0]).getReturnType(); } else { return null; } }
private void addContextualProviderInjectable(final Injectable providerInjectable, final DependencyGraphBuilder builder, final boolean enabled) { final MetaClass providerImpl = providerInjectable.getInjectedType(); final MetaMethod providerMethod = providerImpl.getMethod("provide", Class[].class, Annotation[].class); // Do not get generic return type for contextual providers final MetaClass providedType = providerMethod.getReturnType(); final InjectableType injectableType = (enabled ? InjectableType.ContextualProvider : InjectableType.Disabled); final Injectable providedInjectable = builder.addInjectable(providedType, qualFactory.forUniversallyQualified(), EXACT_TYPE, Dependent.class, injectableType, WiringElementType.Provider, WiringElementType.DependentBean); builder.addProducerMemberDependency(providedInjectable, providerImpl, providerInjectable.getQualifier(), providerMethod); }
private void addProviderInjectable(final Injectable providerImplInjectable, final DependencyGraphBuilder builder, final boolean enabled) { final MetaClass providerImpl = providerImplInjectable.getInjectedType(); final MetaMethod providerMethod = providerImpl.getMethod("get", new Class[0]); final MetaClass providedType = getMethodReturnType(providerMethod); final InjectableType injectableType = (enabled ? InjectableType.Provider : InjectableType.Disabled); final Injectable providedInjectable = builder.addInjectable(providedType, qualFactory.forSource(providerMethod), EXACT_TYPE, Dependent.class, injectableType, WiringElementType.Provider, WiringElementType.DependentBean); builder.addProducerMemberDependency(providedInjectable, providerImplInjectable.getInjectedType(), providerImplInjectable.getQualifier(), providerMethod); }
@Test public void parameterizedTypeIsAssignableToSameTypeWithWildcard() throws Exception { final MetaClass parameterized = parameterizedAs(Collection.class, typeParametersOf(Integer.class)); final MetaClass wildcard = MetaClassFactory.get(WildcardMethod.class).getMethod("method", new Class[0]).getReturnType(); assertTrue(GraphUtil.hasAssignableTypeParameters(parameterized, wildcard)); }
@Test public void testMethodObjectReturnType() { final MetaClass c = getMetaClass(ClassWithGenericMethods.class); final MetaMethod method = c.getMethod("methodReturningObject", new Class[] {}); assertEquals("java.lang.Object", method.getReturnType().getFullyQualifiedNameWithTypeParms()); assertEquals(getTypeOfMetaClassBeingTested(), method.getReturnType().getClass()); // the generic return type should be the same: plain old Object assertEquals(getMetaClass(Object.class), method.getGenericReturnType()); }
private static Object createAccessorImpl(final MetaClass type, final String varName) { final MetaClass propertyType = type.getMethod("getValue", new Class[0]).getReturnType(); return ObjectBuilder.newInstanceOf(NativeHasValueAccessors.Accessor.class) .extend() .publicMethod(Object.class, "get") .append(loadVariable(varName).invoke("getValue").returnValue()) .finish() .publicMethod(void.class, "set", finalOf(Object.class, "value")) .append(loadVariable(varName).invoke("setValue", castTo(propertyType, loadVariable("value")))) .finish() .finish(); } }
private static Object createAccessorImpl(final MetaClass type, final String varName) { final MetaClass propertyType = type.getMethod("getValue", new Class[0]).getReturnType(); return ObjectBuilder.newInstanceOf(NativeHasValueAccessors.Accessor.class) .extend() .publicMethod(Object.class, "get") .append(loadVariable(varName).invoke("getValue").returnValue()) .finish() .publicMethod(void.class, "set", finalOf(Object.class, "value")) .append(loadVariable(varName).invoke("setValue", castTo(propertyType, loadVariable("value")))) .finish() .finish(); } }
@Test public void testMethodReturnTypeWithUpperBoundedWildcardParameter() { final MetaClass c = getMetaClass(ClassWithGenericMethods.class); final MetaMethod method = c.getMethod("methodReturningUpperBoundedWildcardCollection", new Class[] {}); // TODO (ERRAI-459) decide whether it's correct to have the type param present or not // then adjust this assertion to strict equality rather than startsWith() assertTrue(method.getReturnType().getFullyQualifiedNameWithTypeParms().startsWith("java.util.Collection")); final MetaType genericReturnType = method.getGenericReturnType(); assertNotNull(genericReturnType); assertTrue("Got unexpected return type type " + genericReturnType.getClass(), genericReturnType instanceof MetaParameterizedType); final MetaParameterizedType mpReturnType = (MetaParameterizedType) genericReturnType; assertEquals(1, mpReturnType.getTypeParameters().length); // Sole type parameter should be <? extends String> assertTrue(mpReturnType.getTypeParameters()[0] instanceof MetaWildcardType); final MetaWildcardType typeParam = (MetaWildcardType) mpReturnType.getTypeParameters()[0]; assertArrayEquals(new MetaType[] {}, typeParam.getLowerBounds()); assertArrayEquals(new MetaType[] { getMetaClass(String.class) }, typeParam.getUpperBounds()); }
@Test public void testMethodReturnTypeWithLowerBoundedWildcardParameter() { final MetaClass c = getMetaClass(ClassWithGenericMethods.class); final MetaMethod method = c.getMethod("methodReturningLowerBoundedWildcardCollection", new Class[] {}); // TODO (ERRAI-459) decide whether it's correct to have the type param present or not // then adjust this assertion to strict equality rather than startsWith() assertTrue(method.getReturnType().getFullyQualifiedNameWithTypeParms().startsWith("java.util.Collection")); final MetaType genericReturnType = method.getGenericReturnType(); assertNotNull(genericReturnType); assertTrue("Got unexpected return type type " + genericReturnType.getClass(), genericReturnType instanceof MetaParameterizedType); final MetaParameterizedType mpReturnType = (MetaParameterizedType) genericReturnType; assertEquals(1, mpReturnType.getTypeParameters().length); // Sole type parameter should be <? extends String> assertTrue(mpReturnType.getTypeParameters()[0] instanceof MetaWildcardType); final MetaWildcardType typeParam = (MetaWildcardType) mpReturnType.getTypeParameters()[0]; assertArrayEquals(new MetaType[] { getMetaClass(String.class) }, typeParam.getLowerBounds()); assertArrayEquals(new MetaType[] { getMetaClass(Object.class)}, typeParam.getUpperBounds()); }