package org.springside.modules.utils.reflect; import static org.assertj.core.api.Assertions.*; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import org.junit.Test; public class ClassUtilTest { @Test public void getMessage() { assertThat(ClassUtil.getShortClassName(ClassUtilTest.class)).isEqualTo("ClassUtilTest"); assertThat(ClassUtil.getShortClassName(BClass.class)).isEqualTo("ClassUtilTest.BClass"); assertThat(ClassUtil.getShortClassName(ClassUtilTest.class.getName())).isEqualTo("ClassUtilTest"); assertThat(ClassUtil.getShortClassName(BClass.class.getName())).isEqualTo("ClassUtilTest.BClass"); assertThat(ClassUtil.getPackageName(ClassUtilTest.class)).isEqualTo("org.springside.modules.utils.reflect"); assertThat(ClassUtil.getPackageName(BClass.class)).isEqualTo("org.springside.modules.utils.reflect"); assertThat(ClassUtil.getPackageName(ClassUtilTest.class.getName())) .isEqualTo("org.springside.modules.utils.reflect"); assertThat(ClassUtil.getPackageName(BClass.class.getName())).isEqualTo("org.springside.modules.utils.reflect"); } @Test public void getAllClass() { assertThat(ClassUtil.getAllInterfaces(BClass.class)).hasSize(4).contains(AInterface.class, BInterface.class, CInterface.class, DInterface.class); assertThat(ClassUtil.getAllSuperclasses(BClass.class)).hasSize(2).contains(AClass.class, Object.class); assertThat(ClassUtil.getAllAnnotations(BClass.class)).hasSize(4); assertThat(ClassUtil.getAnnotatedPublicFields(BClass.class, AAnnotation.class)).hasSize(2).contains( ClassUtil.getAccessibleField(BClass.class, "sfield"), ClassUtil.getAccessibleField(BClass.class, "tfield")); assertThat(ClassUtil.getAnnotatedFields(BClass.class, EAnnotation.class)).hasSize(3).contains( ClassUtil.getAccessibleField(BClass.class, "bfield"), ClassUtil.getAccessibleField(BClass.class, "efield"), ClassUtil.getAccessibleField(AClass.class, "afield")); assertThat(ClassUtil.getAnnotatedFields(BClass.class, FAnnotation.class)).hasSize(1) .contains(ClassUtil.getAccessibleField(AClass.class, "dfield")); assertThat(ClassUtil.getAnnotatedPublicMethods(BClass.class, FAnnotation.class)).hasSize(3).contains( ClassUtil.getAccessibleMethodByName(BClass.class, "hello"), ClassUtil.getAccessibleMethodByName(BClass.class, "hello3"), ClassUtil.getAccessibleMethodByName(AClass.class, "hello4") ); } @Test public void getSuperClassGenricType() { // 获取第1,2个泛型类型 assertThat(ClassUtil.getClassGenricType(TestBean.class)).isEqualTo(String.class); assertThat(ClassUtil.getClassGenricType(TestBean.class, 1)).isEqualTo(Long.class); // 定义父类时无泛型定义 assertThat(ClassUtil.getClassGenricType(TestBean2.class)).isEqualTo(Object.class); // 无父类定义 assertThat(ClassUtil.getClassGenricType(TestBean3.class)).isEqualTo(Object.class); } public void classPresent(){ assertThat(ClassUtil.isPresent("a.b.c", ClassUtil.getDefaultClassLoader())).isFalse(); assertThat(ClassUtil.isPresent("org.springside.modules.utils.reflect.ClassUtil", ClassUtil.getDefaultClassLoader())).isTrue(); } public static class ParentBean<T, ID> { } public static class TestBean extends ParentBean<String, Long> { } public static class TestBean2 extends ParentBean { } public static class TestBean3 { } public interface AInterface { } @CAnnotation public interface BInterface extends AInterface { @FAnnotation void hello(); } public interface CInterface { } public interface DInterface { } @Retention(RetentionPolicy.RUNTIME) public @interface AAnnotation { } @Retention(RetentionPolicy.RUNTIME) @AAnnotation public @interface BAnnotation { } @Retention(RetentionPolicy.RUNTIME) public @interface CAnnotation { } @Retention(RetentionPolicy.RUNTIME) public @interface DAnnotation { } @Retention(RetentionPolicy.RUNTIME) public @interface EAnnotation { } @Retention(RetentionPolicy.RUNTIME) public @interface FAnnotation { } @DAnnotation public static class AClass implements DInterface { @EAnnotation private int afield; private int cfield; @FAnnotation private int dfield; @AAnnotation public int tfield; @AAnnotation protected int vfield; // not counted as public annotated method public void hello2(int i) { } // counted as public annotated method @FAnnotation public void hello4(int i) { } // not counted as public annotated method @FAnnotation protected void hello5(int i) { } // not counted as public annotated method @FAnnotation private void hello6(int i) { } // not counted as public annotated method, because the child override it @FAnnotation public void hello7(int i) { } } @BAnnotation public static class BClass extends AClass implements CInterface, BInterface { @EAnnotation private int bfield; @EAnnotation private int efield; @AAnnotation public int sfield; @AAnnotation protected int ufield; // counted as public annotated method, BInterface @Override @EAnnotation public void hello() { // TODO Auto-generated method stub } public void hello2(int i) { } // counted as public annotated method @FAnnotation public void hello3(int i) { } // not counted as public annotated method @Override public void hello7(int i) { } } }