本文共 6279 字,大约阅读时间需要 20 分钟。
我们可以通过反射,获取对应的运行时类中所有的属性、方法、构造器、父类、接口、父类的泛型、包、注解、异常等。。。。
典型代码:public class FiledTest { @Test public void test(){ Class clazz = Person.class; //获取属性结构 //getFields():获取当前运行时类及其父类、接口中声明为public访问权限的属性 Field[] fields = clazz.getFields(); for(Field f : fields){ System.out.println(f); } System.out.println(); //getDeclaredFields():获取当前运行时类中声明的所属性(包括公、默认、私,但不包含父类及其接口中声明的属性 Field[] declaredFields = clazz.getDeclaredFields(); for(Field f : declaredFields){ System.out.println(f); } } //权限修饰符 数据类型 变量名 @Test public void test1(){ Class clazz = Person.class; //权限修饰符 Field[] declaredFields = clazz.getDeclaredFields(); for(Field f : declaredFields){ //权限修饰符 int modifiers = f.getModifiers(); System.out.print(Modifier.toString(modifiers) + " "); //数据类型 Class type = f.getType(); System.out.print(type.getName() + " "); //变量名 String name = f.getName(); System.out.print(name); System.out.println(); } }}
public class MethodTest { @Test public void test1(){ Class clazz = Person.class; //getMethods():获取当前运行时类及其所父类(包括Object)中声明为public权限的方法 Method[] methods = clazz.getMethods(); for(Method m : methods){ System.out.println(m); } System.out.println(); //getDeclaredMethods():获取当前运行时类中声明的所方法。(不包含父类中声明的方法 Method[] declaredMethods = clazz.getDeclaredMethods(); for(Method m : declaredMethods){ System.out.println(m); } } /* @Xxxx 权限修饰符 返回值类型 方法名(参数类型1 形参名1,...) throws XxxException{} */ @Test public void test2(){ Class clazz = Person.class; Method[] declaredMethods = clazz.getDeclaredMethods(); for(Method m : declaredMethods){ //1.获取方法声明的注解 Annotation[] annotations = m.getAnnotations(); for (Annotation a : annotations){ System.out.println(a); } //2.权限修饰符 int modifiers = m.getModifiers(); System.out.print(Modifier.toString(modifiers) + " "); //3.返回值类型 Class returnType = m.getReturnType(); System.out.print(returnType.getName() + " "); //4.方法名 String name = m.getName(); System.out.print(name + "("); //5.形参列表 Class[] parameterTypes = m.getParameterTypes(); if(parameterTypes.length > 0){ for (int i = 0; i < parameterTypes.length; i++) { if(i == parameterTypes.length - 1){ System.out.print(parameterTypes[i].getName() +" " + "args_" + i); break; } System.out.print(parameterTypes[i].getName() + " " + "args_" + i + ","); } } System.out.print(")" + " "); //6.抛出的异常' Class[] exceptionTypes = m.getExceptionTypes(); if(exceptionTypes.length > 0){ System.out.print("throws" + " "); for (int i = 0; i < exceptionTypes.length; i++) { if(i == exceptionTypes.length -1){ System.out.print(exceptionTypes[i].getName()); break; } System.out.print(exceptionTypes[i].getName() + ","); } } System.out.println(); } }}
public class OtherTest { /* 获取构造器结构 */ @Test public void test1() { Class clazz = Person.class; //getConstructors():获取当前运行时类(不包括父类的)中声明为public的构造器 Constructor[] constructors = clazz.getConstructors(); for (Constructor c : constructors) { System.out.println(c); } System.out.println(); //getDeclaredConstructors():获取当前运行时类中声明的所的构造器 Constructor[] declaredConstructors = clazz.getDeclaredConstructors(); for (Constructor c : declaredConstructors) { System.out.println(c); } }
/* 获取运行时类的父类 */ @Test public void test2() { Class clazz = Person.class; Class superclass = clazz.getSuperclass(); System.out.println(superclass);//class loey.Person.Creature }
/* 获取运行时类的带泛型的父类 */ @Test public void test3() { Class clazz = Person.class; Type genericSuperclass = clazz.getGenericSuperclass(); System.out.println(genericSuperclass);//loey.Person.Creature/* 获取运行时类的带泛型的父类的泛型 代码:逻辑性代码 vs 功能性代码 */ ParameterizedType parameterizedType = (ParameterizedType) genericSuperclass; //获取泛型类型 Type[] actualTypeArguments = parameterizedType.getActualTypeArguments(); // System.out.println(actualTypeArguments[0].getTypeName());// System.out.println(((Class)actualTypeArguments[0]).getName()); for (Type t : actualTypeArguments) { System.out.println(t.getTypeName()); } }
/* 获取运行时类实现的接口 */ @Test public void test4() { Class clazz = Person.class; Class[] interfaces = clazz.getInterfaces(); for(Class i : interfaces){ System.out.println(i); } System.out.println(); //获取运行时类的父类实现的接口 Class superclass = clazz.getSuperclass(); Class[] interfaces1 = superclass.getInterfaces(); for(Class c : interfaces1){ System.out.println(c); } }
/* 获取运行时类所在的包 */ @Test public void test5(){ Class clazz = Person.class; Package aPackage = clazz.getPackage(); System.out.println(aPackage); }
/* 获取运行时类声明的注解 */ @Test public void test6(){ Class clazz = Person.class; Annotation[] annotations = clazz.getAnnotations(); for(Annotation a : annotations){ System.out.println(a); } }}
转载地址:http://rvuki.baihongyu.com/