/***************************************************************************
* Copyright 2009-2012 by Christian Ihle *
* kontakt@usikkert.net *
* *
* This file is part of KouInject. *
* *
* KouInject is free software; you can redistribute it and/or modify *
* it under the terms of the GNU Lesser General Public License as *
* published by the Free Software Foundation, either version 3 of *
* the License, or (at your option) any later version. *
* *
* KouInject is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU *
* Lesser General Public License for more details. *
* *
* You should have received a copy of the GNU Lesser General Public *
* License along with KouInject. *
* If not, see <http://www.gnu.org/licenses/>. *
***************************************************************************/
package net.usikkert.kouinject.util;
import static org.junit.Assert.*;
import java.lang.reflect.Field;
import java.lang.reflect.Member;
import java.lang.reflect.Method;
import java.util.List;
import net.usikkert.kouinject.testbeans.notscanned.SomeEnum;
import net.usikkert.kouinject.testbeans.notscanned.notloaded.FieldModifierBean;
import net.usikkert.kouinject.testbeans.scanned.GarageBean;
import net.usikkert.kouinject.testbeans.scanned.HelloBean;
import net.usikkert.kouinject.testbeans.scanned.coffee.CoffeeBean;
import net.usikkert.kouinject.testbeans.scanned.coffee.JavaBean;
import net.usikkert.kouinject.testbeans.scanned.hierarchy.ChildBean;
import net.usikkert.kouinject.testbeans.scanned.hierarchy.MiddleBean;
import net.usikkert.kouinject.testbeans.scanned.hierarchy.SuperBean;
import net.usikkert.kouinject.testbeans.scanned.hierarchy.overriding.OverridingChildBean;
import net.usikkert.kouinject.testbeans.scanned.hierarchy.overriding.OverridingFirstAbstractBean;
import net.usikkert.kouinject.testbeans.scanned.hierarchy.overriding.OverridingInterface;
import net.usikkert.kouinject.testbeans.scanned.hierarchy.overriding.OverridingSecondAbstractBean;
import net.usikkert.kouinject.testbeans.scanned.hierarchy.overriding.OverridingSuperBean;
import net.usikkert.kouinject.testbeans.scanned.hierarchy.overriding.subpackage.OverridingSubpackageBean;
import net.usikkert.kouinject.testbeans.scanned.hierarchy.overriding2.AnimalBean;
import net.usikkert.kouinject.testbeans.scanned.hierarchy.overriding2.OrganismBean;
import net.usikkert.kouinject.testbeans.scanned.hierarchy.overriding2.PetBean;
import net.usikkert.kouinject.testbeans.scanned.hierarchy.overriding2.pets.CatBean;
import net.usikkert.kouinject.testbeans.scanned.qualifier.Yellow;
import org.junit.Before;
import org.junit.Test;
/**
* Test of {@link ReflectionUtils}.
*
* @author Christian Ihle
*/
public class ReflectionUtilsTest {
private ReflectionUtils reflectionUtils;
@Before
public void createReflectionUtils() {
reflectionUtils = new ReflectionUtils();
}
@Test
public void findAllMethodsShouldFindMethodsInCurrentClassAndSuperClassesExceptObject() {
assertEquals(3, reflectionUtils.findAllMethods(OverridingFirstAbstractBean.class).size());
assertEquals(5, reflectionUtils.findAllMethods(OverridingSecondAbstractBean.class).size());
assertEquals(13, reflectionUtils.findAllMethods(OverridingSuperBean.class).size());
assertEquals(22, reflectionUtils.findAllMethods(OverridingChildBean.class).size());
assertEquals(0, reflectionUtils.findAllMethods(HelloBean.class).size());
assertEquals(0, reflectionUtils.findAllMethods(Object.class).size());
}
@Test
public void findAllMembersShouldFindFieldsAndMethodsInCurrentClassAndSuperClassesExceptObject() {
assertEquals(24, reflectionUtils.findAllMembers(OrganismBean.class).size());
assertEquals(48, reflectionUtils.findAllMembers(AnimalBean.class).size());
assertEquals(72, reflectionUtils.findAllMembers(PetBean.class).size());
assertEquals(96, reflectionUtils.findAllMembers(CatBean.class).size());
assertEquals(0, reflectionUtils.findAllMembers(HelloBean.class).size());
assertEquals(0, reflectionUtils.findAllMembers(Object.class).size());
}
@Test
public void findAllMembersShouldOrderByFieldsThenMethodsFromSuperclassToSubclass() {
final List<Member> members = reflectionUtils.findAllMembers(CatBean.class);
assertEquals(96, members.size());
final List<Member> organismMembers = members.subList(0, 24);
final List<Member> animalMembers = members.subList(24, 48);
final List<Member> petMembers = members.subList(48, 72);
final List<Member> catMembers = members.subList(72, 96);
validateSublist(organismMembers, OrganismBean.class);
validateSublist(animalMembers, AnimalBean.class);
validateSublist(petMembers, PetBean.class);
validateSublist(catMembers, CatBean.class);
}
private void validateSublist(final List<Member> members, final Class<?> beanClass) {
assertEquals(24, members.size());
for (int i = 0; i < members.size(); i++) {
final Member member = members.get(i);
assertEquals(beanClass, member.getDeclaringClass());
if (i < 9) {
assertTrue(member instanceof Field);
}
else {
assertTrue(member instanceof Method);
}
}
}
@Test
public void interfacesCanNotBeOverridden() throws Exception {
final Method overridingInterfaceMethod = OverridingInterface.class.getDeclaredMethod("publicMethod");
final Method overridingFirstAbstractBeanMethod = OverridingFirstAbstractBean.class.getDeclaredMethod("publicMethod");
final Method overridingSecondAbstractBeanMethod = OverridingSecondAbstractBean.class.getDeclaredMethod("publicMethod");
final Method overridingSuperBeanMethod = OverridingSuperBean.class.getDeclaredMethod("publicMethod");
final Method overridingChildBeanMethod = OverridingChildBean.class.getDeclaredMethod("publicMethod");
assertFalse(reflectionUtils.isOverridden(overridingFirstAbstractBeanMethod, overridingInterfaceMethod));
assertFalse(reflectionUtils.isOverridden(overridingSecondAbstractBeanMethod, overridingInterfaceMethod));
assertFalse(reflectionUtils.isOverridden(overridingSuperBeanMethod, overridingInterfaceMethod));
assertFalse(reflectionUtils.isOverridden(overridingChildBeanMethod, overridingInterfaceMethod));
}
@Test
public void abstractClassMethodsCanOverrideEachOther() throws Exception {
final Method overridingFirstAbstractBeanMethod = OverridingFirstAbstractBean.class.getDeclaredMethod("publicMethod");
final Method overridingSecondAbstractBeanMethod = OverridingSecondAbstractBean.class.getDeclaredMethod("publicMethod");
assertTrue(reflectionUtils.isOverridden(overridingFirstAbstractBeanMethod, overridingSecondAbstractBeanMethod));
assertFalse(reflectionUtils.isOverridden(overridingSecondAbstractBeanMethod, overridingFirstAbstractBeanMethod));
}
@Test
public void abstractClassMethodsCanBeOverridden() throws Exception {
final Method overridingFirstAbstractBeanMethod = OverridingFirstAbstractBean.class.getDeclaredMethod("publicMethod");
final Method overridingSecondAbstractBeanMethod = OverridingSecondAbstractBean.class.getDeclaredMethod("publicMethod");
final Method overridingSuperBeanMethod = OverridingSuperBean.class.getDeclaredMethod("publicMethod");
final Method overridingChildBeanMethod = OverridingChildBean.class.getDeclaredMethod("publicMethod");
assertTrue(reflectionUtils.isOverridden(overridingFirstAbstractBeanMethod, overridingSecondAbstractBeanMethod));
assertTrue(reflectionUtils.isOverridden(overridingFirstAbstractBeanMethod, overridingSuperBeanMethod));
assertTrue(reflectionUtils.isOverridden(overridingFirstAbstractBeanMethod, overridingChildBeanMethod));
assertFalse(reflectionUtils.isOverridden(overridingSecondAbstractBeanMethod, overridingFirstAbstractBeanMethod));
assertTrue(reflectionUtils.isOverridden(overridingSecondAbstractBeanMethod, overridingSuperBeanMethod));
assertTrue(reflectionUtils.isOverridden(overridingSecondAbstractBeanMethod, overridingChildBeanMethod));
}
@Test
public void abstractMethodsMustBeOverridden() throws Exception {
final Method overridingFirstAbstractBeanMethod = OverridingFirstAbstractBean.class.getDeclaredMethod("abstractMethod");
final Method overridingSuperBeanMethod = OverridingSuperBean.class.getDeclaredMethod("abstractMethod");
assertTrue(reflectionUtils.isOverridden(overridingFirstAbstractBeanMethod, overridingSuperBeanMethod));
assertFalse(reflectionUtils.isOverridden(overridingSuperBeanMethod, overridingFirstAbstractBeanMethod));
}
@Test
public void publicMethodsCanBeOverridden() throws Exception {
final Method overridingFirstAbstractBeanMethod = OverridingFirstAbstractBean.class.getDeclaredMethod("publicMethod");
final Method overridingSecondAbstractBeanMethod = OverridingSecondAbstractBean.class.getDeclaredMethod("publicMethod");
final Method overridingSuperBeanMethod = OverridingSuperBean.class.getDeclaredMethod("publicMethod");
final Method overridingChildBeanMethod = OverridingChildBean.class.getDeclaredMethod("publicMethod");
assertFalse(reflectionUtils.isOverridden(overridingSecondAbstractBeanMethod, overridingFirstAbstractBeanMethod));
assertFalse(reflectionUtils.isOverridden(overridingSuperBeanMethod, overridingFirstAbstractBeanMethod));
assertFalse(reflectionUtils.isOverridden(overridingChildBeanMethod, overridingFirstAbstractBeanMethod));
assertTrue(reflectionUtils.isOverridden(overridingFirstAbstractBeanMethod, overridingSecondAbstractBeanMethod));
assertFalse(reflectionUtils.isOverridden(overridingSuperBeanMethod, overridingSecondAbstractBeanMethod));
assertFalse(reflectionUtils.isOverridden(overridingChildBeanMethod, overridingSecondAbstractBeanMethod));
assertTrue(reflectionUtils.isOverridden(overridingFirstAbstractBeanMethod, overridingSuperBeanMethod));
assertTrue(reflectionUtils.isOverridden(overridingSecondAbstractBeanMethod, overridingSuperBeanMethod));
assertFalse(reflectionUtils.isOverridden(overridingChildBeanMethod, overridingSuperBeanMethod));
assertTrue(reflectionUtils.isOverridden(overridingFirstAbstractBeanMethod, overridingChildBeanMethod));
assertTrue(reflectionUtils.isOverridden(overridingSecondAbstractBeanMethod, overridingChildBeanMethod));
assertTrue(reflectionUtils.isOverridden(overridingSuperBeanMethod, overridingChildBeanMethod));
}
@Test
public void privateMethodsCannotBeOverridden() throws Exception {
final Method overridingFirstAbstractBeanMethod = OverridingFirstAbstractBean.class.getDeclaredMethod("privateMethod");
final Method overridingSuperBeanMethod = OverridingSuperBean.class.getDeclaredMethod("privateMethod");
final Method overridingChildBeanMethod = OverridingChildBean.class.getDeclaredMethod("privateMethod");
assertFalse(reflectionUtils.isOverridden(overridingSuperBeanMethod, overridingFirstAbstractBeanMethod));
assertFalse(reflectionUtils.isOverridden(overridingChildBeanMethod, overridingFirstAbstractBeanMethod));
assertFalse(reflectionUtils.isOverridden(overridingFirstAbstractBeanMethod, overridingSuperBeanMethod));
assertFalse(reflectionUtils.isOverridden(overridingChildBeanMethod, overridingSuperBeanMethod));
assertFalse(reflectionUtils.isOverridden(overridingFirstAbstractBeanMethod, overridingChildBeanMethod));
assertFalse(reflectionUtils.isOverridden(overridingSuperBeanMethod, overridingChildBeanMethod));
}
@Test
public void staticMethodsCannotBeOverridden() throws Exception {
final Method overridingSuperBeanMethod = OverridingSuperBean.class.getDeclaredMethod("staticMethod");
final Method overridingChildBeanMethod = OverridingChildBean.class.getDeclaredMethod("staticMethod");
assertFalse(reflectionUtils.isOverridden(overridingSuperBeanMethod, overridingChildBeanMethod));
assertFalse(reflectionUtils.isOverridden(overridingChildBeanMethod, overridingSuperBeanMethod));
}
@Test
public void finalMethodsCannotBeOverriddenButCanOverride() throws Exception {
final Method overridingSuperBeanMethod = OverridingSuperBean.class.getDeclaredMethod("finalMethod");
final Method overridingChildBeanMethod = OverridingChildBean.class.getDeclaredMethod("finalMethod");
assertTrue(reflectionUtils.isOverridden(overridingSuperBeanMethod, overridingChildBeanMethod));
assertFalse(reflectionUtils.isOverridden(overridingChildBeanMethod, overridingSuperBeanMethod));
}
@Test
public void protectedMethodsCanBeOverridden() throws Exception {
final Method overridingSuperBeanMethod = OverridingSuperBean.class.getDeclaredMethod("protectedMethod");
final Method overridingChildBeanMethod = OverridingChildBean.class.getDeclaredMethod("protectedMethod");
assertTrue(reflectionUtils.isOverridden(overridingSuperBeanMethod, overridingChildBeanMethod));
assertFalse(reflectionUtils.isOverridden(overridingChildBeanMethod, overridingSuperBeanMethod));
}
@Test
public void defaultMethodsCanBeOverridden() throws Exception {
final Method overridingSuperBeanMethod = OverridingSuperBean.class.getDeclaredMethod("defaultMethod");
final Method overridingChildBeanMethod = OverridingChildBean.class.getDeclaredMethod("defaultMethod");
assertTrue(reflectionUtils.isOverridden(overridingSuperBeanMethod, overridingChildBeanMethod));
assertFalse(reflectionUtils.isOverridden(overridingChildBeanMethod, overridingSuperBeanMethod));
}
@Test
public void methodsInClassesInheritingFromSameSuperClassCannotOverrideEachOther() throws Exception {
final Method overridingChildBeanMethod = OverridingChildBean.class.getDeclaredMethod("publicMethod");
final Method overridingSubpackageBeanMethod = OverridingSubpackageBean.class.getDeclaredMethod("publicMethod");
assertFalse(reflectionUtils.isOverridden(overridingChildBeanMethod, overridingSubpackageBeanMethod));
assertFalse(reflectionUtils.isOverridden(overridingSubpackageBeanMethod, overridingChildBeanMethod));
}
@Test
public void publicMethodsInClassesInDifferentPackagesCanBeOverridden() throws Exception {
final Method overridingSuperBeanMethod = OverridingSuperBean.class.getDeclaredMethod("publicMethod");
final Method overridingSubpackageBeanMethod = OverridingSubpackageBean.class.getDeclaredMethod("publicMethod");
assertTrue(reflectionUtils.isOverridden(overridingSuperBeanMethod, overridingSubpackageBeanMethod));
assertFalse(reflectionUtils.isOverridden(overridingSubpackageBeanMethod, overridingSuperBeanMethod));
}
@Test
public void protectedMethodsInClassesInDifferentPackagesCanBeOverridden() throws Exception {
final Method overridingSuperBeanMethod = OverridingSuperBean.class.getDeclaredMethod("protectedMethod");
final Method overridingSubpackageBeanMethod = OverridingSubpackageBean.class.getDeclaredMethod("protectedMethod");
assertTrue(reflectionUtils.isOverridden(overridingSuperBeanMethod, overridingSubpackageBeanMethod));
assertFalse(reflectionUtils.isOverridden(overridingSubpackageBeanMethod, overridingSuperBeanMethod));
}
@Test
public void defaultMethodsInClassesInDifferentPackagesCannotBeOverridden() throws Exception {
final Method overridingSuperBeanMethod = OverridingSuperBean.class.getDeclaredMethod("defaultMethod");
final Method overridingSubpackageBeanMethod = OverridingSubpackageBean.class.getDeclaredMethod("defaultMethod");
assertFalse(reflectionUtils.isOverridden(overridingSuperBeanMethod, overridingSubpackageBeanMethod));
assertFalse(reflectionUtils.isOverridden(overridingSubpackageBeanMethod, overridingSuperBeanMethod));
}
@Test
public void methodsMustHaveTheSameNameToBeOverridden() throws Exception {
final Method overridingSuperBeanMethod = OverridingSuperBean.class.getDeclaredMethod("publicMethod");
final Method overridingChildBeanMethod = OverridingChildBean.class.getDeclaredMethod("publicMethod2");
assertFalse(reflectionUtils.isOverridden(overridingSuperBeanMethod, overridingChildBeanMethod));
assertFalse(reflectionUtils.isOverridden(overridingChildBeanMethod, overridingSuperBeanMethod));
}
@Test
public void methodsMustHaveTheSameParametersToBeOverridden() throws Exception {
final Method superWithNoParam = OverridingSuperBean.class.getDeclaredMethod("publicMethod");
final Method superWithObjectParam = OverridingSuperBean.class.getDeclaredMethod("publicMethod", Object.class);
final Method childWithNoParam = OverridingChildBean.class.getDeclaredMethod("publicMethod");
final Method childWithStringParam = OverridingChildBean.class.getDeclaredMethod("publicMethod", String.class);
final Method childWithObjectParam = OverridingChildBean.class.getDeclaredMethod("publicMethod", Object.class);
assertTrue(reflectionUtils.isOverridden(superWithNoParam, childWithNoParam));
assertFalse(reflectionUtils.isOverridden(superWithObjectParam, childWithNoParam));
assertFalse(reflectionUtils.isOverridden(superWithNoParam, childWithStringParam));
assertFalse(reflectionUtils.isOverridden(superWithObjectParam, childWithStringParam));
assertFalse(reflectionUtils.isOverridden(superWithNoParam, childWithObjectParam));
assertTrue(reflectionUtils.isOverridden(superWithObjectParam, childWithObjectParam));
}
@Test
public void isSubClassOf() {
assertTrue(reflectionUtils.isSubClassOf(ChildBean.class, MiddleBean.class));
assertTrue(reflectionUtils.isSubClassOf(MiddleBean.class, SuperBean.class));
assertTrue(reflectionUtils.isSubClassOf(SuperBean.class, Object.class));
assertTrue(reflectionUtils.isSubClassOf(ChildBean.class, SuperBean.class));
assertTrue(reflectionUtils.isSubClassOf(ChildBean.class, Object.class));
assertFalse(reflectionUtils.isSubClassOf(SuperBean.class, SuperBean.class));
assertFalse(reflectionUtils.isSubClassOf(MiddleBean.class, ChildBean.class));
assertFalse(reflectionUtils.isSubClassOf(SuperBean.class, MiddleBean.class));
assertFalse(reflectionUtils.isSubClassOf(Object.class, SuperBean.class));
assertFalse(reflectionUtils.isSubClassOf(SuperBean.class, ChildBean.class));
assertFalse(reflectionUtils.isSubClassOf(Object.class, ChildBean.class));
}
@Test
public void methodModifiers() throws Exception {
final Method publicMethod = OverridingChildBean.class.getDeclaredMethod("publicMethod");
assertTrue(reflectionUtils.isPublic(publicMethod));
assertFalse(reflectionUtils.isPackagePrivate(publicMethod));
assertFalse(reflectionUtils.isPrivate(publicMethod));
assertFalse(reflectionUtils.isProtected(publicMethod));
final Method protectedMethod = OverridingChildBean.class.getDeclaredMethod("protectedMethod");
assertTrue(reflectionUtils.isProtected(protectedMethod));
assertFalse(reflectionUtils.isPublic(protectedMethod));
assertFalse(reflectionUtils.isPackagePrivate(protectedMethod));
assertFalse(reflectionUtils.isPrivate(protectedMethod));
final Method defaultMethod = OverridingChildBean.class.getDeclaredMethod("defaultMethod");
assertTrue(reflectionUtils.isPackagePrivate(defaultMethod));
assertFalse(reflectionUtils.isProtected(defaultMethod));
assertFalse(reflectionUtils.isPublic(defaultMethod));
assertFalse(reflectionUtils.isPrivate(defaultMethod));
final Method privateMethod = OverridingSuperBean.class.getDeclaredMethod("privateMethod");
assertTrue(reflectionUtils.isPrivate(privateMethod));
assertFalse(reflectionUtils.isPackagePrivate(privateMethod));
assertFalse(reflectionUtils.isProtected(privateMethod));
assertFalse(reflectionUtils.isPublic(privateMethod));
final Method finalMethod = OverridingChildBean.class.getDeclaredMethod("finalMethod");
assertTrue(reflectionUtils.isFinal(finalMethod));
final Method staticMethod = OverridingChildBean.class.getDeclaredMethod("staticMethod");
assertTrue(reflectionUtils.isStatic(staticMethod));
}
@Test
public void classModifiers() throws Exception {
assertTrue(reflectionUtils.isAbstract(OverridingFirstAbstractBean.class));
}
@Test
public void fieldModifiers() throws Exception {
final Field publicField = FieldModifierBean.class.getDeclaredField("publicField");
assertTrue(reflectionUtils.isPublic(publicField));
final Field protectedField = FieldModifierBean.class.getDeclaredField("protectedField");
assertTrue(reflectionUtils.isProtected(protectedField));
final Field defaultField = FieldModifierBean.class.getDeclaredField("defaultField");
assertTrue(reflectionUtils.isPackagePrivate(defaultField));
final Field privateField = FieldModifierBean.class.getDeclaredField("privateField");
assertTrue(reflectionUtils.isPrivate(privateField));
final Field finalField = FieldModifierBean.class.getDeclaredField("finalField");
assertTrue(reflectionUtils.isFinal(finalField));
final Field staticField = FieldModifierBean.class.getDeclaredField("staticField");
assertTrue(reflectionUtils.isStatic(staticField));
}
@Test
public void isInTheSamePackage() throws Exception {
final Method coffeeBeanMethod = CoffeeBean.class.getDeclaredMethod("getHelloBean");
final Method javaBeanMethod = JavaBean.class.getDeclaredMethod("getHelloBean");
final Method garageBeanMethod = GarageBean.class.getDeclaredMethod("getBlueCarBean");
assertTrue(reflectionUtils.isInTheSamePackage(coffeeBeanMethod, javaBeanMethod));
assertFalse(reflectionUtils.isInTheSamePackage(coffeeBeanMethod, garageBeanMethod));
}
@Test
public void hasOverridableAccessModifiers() throws Exception {
final Method publicMethod = OverridingChildBean.class.getDeclaredMethod("publicMethod");
final Method publicSubPackageMethod = OverridingSubpackageBean.class.getDeclaredMethod("publicMethod");
final Method protectedMethod = OverridingChildBean.class.getDeclaredMethod("protectedMethod");
final Method defaultMethod = OverridingChildBean.class.getDeclaredMethod("defaultMethod");
final Method defaultSubPackageMethod = OverridingSubpackageBean.class.getDeclaredMethod("defaultMethod");
final Method privateMethod = OverridingSuperBean.class.getDeclaredMethod("privateMethod");
final Method finalMethod = OverridingChildBean.class.getDeclaredMethod("finalMethod");
final Method staticMethod = OverridingChildBean.class.getDeclaredMethod("staticMethod");
assertFalse(reflectionUtils.hasOverridableAccessModifiers(finalMethod, null));
assertFalse(reflectionUtils.hasOverridableAccessModifiers(staticMethod, null));
assertFalse(reflectionUtils.hasOverridableAccessModifiers(privateMethod, null));
assertFalse(reflectionUtils.hasOverridableAccessModifiers(publicMethod, staticMethod));
assertFalse(reflectionUtils.hasOverridableAccessModifiers(publicMethod, privateMethod));
assertTrue(reflectionUtils.hasOverridableAccessModifiers(defaultMethod, defaultMethod));
assertFalse(reflectionUtils.hasOverridableAccessModifiers(defaultMethod, defaultSubPackageMethod));
assertFalse(reflectionUtils.hasOverridableAccessModifiers(defaultSubPackageMethod, defaultMethod));
assertFalse(reflectionUtils.hasOverridableAccessModifiers(defaultSubPackageMethod, publicMethod));
assertTrue(reflectionUtils.hasOverridableAccessModifiers(defaultMethod, protectedMethod));
assertTrue(reflectionUtils.hasOverridableAccessModifiers(protectedMethod, publicMethod));
assertTrue(reflectionUtils.hasOverridableAccessModifiers(publicMethod, publicSubPackageMethod));
}
@Test
public void hasTheSameName() throws Exception {
final Method firstPublicMethod = OverridingFirstAbstractBean.class.getDeclaredMethod("publicMethod");
final Method secondPublicMethod = OverridingSecondAbstractBean.class.getDeclaredMethod("publicMethod");
final Method staticMethod = OverridingChildBean.class.getDeclaredMethod("staticMethod");
assertTrue(reflectionUtils.hasTheSameName(firstPublicMethod, secondPublicMethod));
assertTrue(reflectionUtils.hasTheSameName(secondPublicMethod, firstPublicMethod));
assertFalse(reflectionUtils.hasTheSameName(firstPublicMethod, staticMethod));
assertFalse(reflectionUtils.hasTheSameName(staticMethod, firstPublicMethod));
assertFalse(reflectionUtils.hasTheSameName(secondPublicMethod, staticMethod));
assertFalse(reflectionUtils.hasTheSameName(staticMethod, secondPublicMethod));
}
@Test
public void hasTheSameParameters() throws Exception {
final Method superWithNoParam = OverridingSuperBean.class.getDeclaredMethod("publicMethod");
final Method superWithObjectParam = OverridingSuperBean.class.getDeclaredMethod("publicMethod", Object.class);
final Method childWithNoParam = OverridingChildBean.class.getDeclaredMethod("publicMethod");
final Method childWithStringParam = OverridingChildBean.class.getDeclaredMethod("publicMethod", String.class);
final Method childWithObjectParam = OverridingChildBean.class.getDeclaredMethod("publicMethod", Object.class);
assertTrue(reflectionUtils.hasTheSameParameters(superWithNoParam, childWithNoParam));
assertFalse(reflectionUtils.hasTheSameParameters(superWithObjectParam, childWithNoParam));
assertFalse(reflectionUtils.hasTheSameParameters(superWithNoParam, childWithStringParam));
assertFalse(reflectionUtils.hasTheSameParameters(superWithObjectParam, childWithStringParam));
assertFalse(reflectionUtils.hasTheSameParameters(superWithNoParam, childWithObjectParam));
assertTrue(reflectionUtils.hasTheSameParameters(superWithObjectParam, childWithObjectParam));
}
@Test
public void isNormalClass() throws ClassNotFoundException {
assertTrue(reflectionUtils.isNormalClass(OverridingChildBean.class));
assertFalse(reflectionUtils.isNormalClass(OverridingInterface.class));
assertFalse(reflectionUtils.isNormalClass(OverridingFirstAbstractBean.class));
assertFalse(reflectionUtils.isNormalClass(Yellow.class));
assertFalse(reflectionUtils.isNormalClass(SomeEnum.class));
assertFalse(reflectionUtils.isNormalClass(MemberClass.class));
final Object anonymousObject = new Object() {};
assertFalse(reflectionUtils.isNormalClass(anonymousObject.getClass()));
assertTrue(reflectionUtils.isNormalClass(Object.class));
// Note: don't know how to test synthetic classes
}
/**
* Class for testing detection of member classes.
*/
private class MemberClass {
}
}