概述

我们可以通过反射,获取对应的运行时类中所有的属性(Field)、方法(Method)、构造器(Constructor)、父类(Superclass)、接口(Interface)、父类的泛型、包、注解(Annotation )、异常等。。。。


获取全部的属性

image.png

field类位于java.lang.reflect包下。在Java反射中Field类描述的是类的属性信息

  1. /**
  2. * 获取当前运行时类的属性结构
  3. *
  4. * @author shkstart
  5. * @create 2019 下午 3:23
  6. */
  7. public class FieldTest {
  8. @Test
  9. public void test1(){
  10. Class clazz = Person.class;
  11. //获取属性结构
  12. //getFields():获取当前运行时类及其父类中声明为public访问权限的属性
  13. Field[] fields = clazz.getFields();
  14. for(Field f : fields){
  15. System.out.println(f);
  16. }
  17. System.out.println();
  18. //getDeclaredFields():获取当前运行时类中声明的所有属性。(不包含父类中声明的属性)
  19. Field[] declaredFields = clazz.getDeclaredFields();
  20. for(Field f : declaredFields){
  21. System.out.println(f);
  22. }
  23. }
  24. //权限修饰符 数据类型 变量名
  25. @Test
  26. public void test2(){
  27. Class clazz = Person.class;
  28. Field[] declaredFields = clazz.getDeclaredFields();
  29. for(Field f : declaredFields){
  30. //1.权限修饰符
  31. int modifier = f.getModifiers();
  32. System.out.print(Modifier.toString(modifier) + "\t");
  33. //2.数据类型
  34. Class type = f.getType();
  35. System.out.print(type.getName() + "\t");
  36. //3.变量名
  37. String fName = f.getName();
  38. System.out.print(fName);
  39. System.out.println();
  40. }
  41. }
  42. }

获取全部的方法

image.png

  1. @Test
  2. public void test1(){
  3. Class clazz = Person.class;
  4. //getMethods():获取当前运行时类及其所有父类中声明为public权限的方法
  5. Method[] methods = clazz.getMethods();
  6. for(Method m : methods){
  7. System.out.println(m);
  8. }
  9. System.out.println();
  10. //getDeclaredMethods():获取当前运行时类中声明的所有方法。(不包含父类中声明的方法)
  11. Method[] declaredMethods = clazz.getDeclaredMethods();
  12. for(Method m : declaredMethods){
  13. System.out.println(m);
  14. }
  15. }
  16. /*
  17. @Xxxx
  18. 权限修饰符 返回值类型 方法名(参数类型1 形参名1,...) throws XxxException{}
  19. */
  20. @Test
  21. public void test2(){
  22. Class clazz = Person.class;
  23. Method[] declaredMethods = clazz.getDeclaredMethods();
  24. for(Method m : declaredMethods){
  25. //1.获取方法声明的注解
  26. Annotation[] annos = m.getAnnotations();
  27. for(Annotation a : annos){
  28. System.out.println(a);
  29. }
  30. //2.权限修饰符
  31. System.out.print(Modifier.toString(m.getModifiers()) + "\t");
  32. //3.返回值类型
  33. System.out.print(m.getReturnType().getName() + "\t");
  34. //4.方法名
  35. System.out.print(m.getName());
  36. System.out.print("(");
  37. //5.形参列表
  38. Class[] parameterTypes = m.getParameterTypes();
  39. if(!(parameterTypes == null && parameterTypes.length == 0)){
  40. for(int i = 0;i < parameterTypes.length;i++){
  41. if(i == parameterTypes.length - 1){
  42. System.out.print(parameterTypes[i].getName() + " args_" + i);
  43. break;
  44. }
  45. System.out.print(parameterTypes[i].getName() + " args_" + i + ",");
  46. }
  47. }
  48. System.out.print(")");
  49. //6.抛出的异常
  50. Class[] exceptionTypes = m.getExceptionTypes();
  51. if(exceptionTypes.length > 0){
  52. System.out.print("throws ");
  53. for(int i = 0;i < exceptionTypes.length;i++){
  54. if(i == exceptionTypes.length - 1){
  55. System.out.print(exceptionTypes[i].getName());
  56. break;
  57. }
  58. System.out.print(exceptionTypes[i].getName() + ",");
  59. }
  60. }
  61. System.out.println();
  62. }
  63. }

获取构造器结构

image.png

  1. @Test
  2. public void test1(){
  3. Class clazz = Person.class;
  4. //getConstructors():获取当前运行时类中声明为public的构造器
  5. Constructor[] constructors = clazz.getConstructors();
  6. for(Constructor c : constructors){
  7. System.out.println(c);
  8. }
  9. System.out.println();
  10. //getDeclaredConstructors():获取当前运行时类中声明的所有的构造器
  11. Constructor[] declaredConstructors = clazz.getDeclaredConstructors();
  12. for(Constructor c : declaredConstructors){
  13. System.out.println(c);
  14. }
  15. }

获取运行时类的父类

image.pngimage.png

  1. /*
  2. 获取运行时类的父类
  3. */
  4. @Test
  5. public void test2(){
  6. Class clazz = Person.class;
  7. Class superclass = clazz.getSuperclass();
  8. System.out.println(superclass);
  9. }
  10. /*
  11. 获取运行时类的带泛型的父类
  12. */
  13. @Test
  14. public void test3(){
  15. Class clazz = Person.class;
  16. Type genericSuperclass = clazz.getGenericSuperclass();
  17. System.out.println(genericSuperclass);
  18. }
  19. /*
  20. 获取运行时类的带泛型的父类的泛型
  21. 代码:逻辑性代码 vs 功能性代码
  22. */
  23. @Test
  24. public void test4(){
  25. Class clazz = Person.class;
  26. Type genericSuperclass = clazz.getGenericSuperclass();
  27. ParameterizedType paramType = (ParameterizedType) genericSuperclass;
  28. //获取泛型类型
  29. Type[] actualTypeArguments = paramType.getActualTypeArguments();
  30. // System.out.println(actualTypeArguments[0].getTypeName());
  31. System.out.println(((Class)actualTypeArguments[0]).getName());
  32. }

获取运行时类实现的接口

image.png

  1. /*
  2. 获取运行时类实现的接口
  3. */
  4. @Test
  5. public void test5(){
  6. Class clazz = Person.class;
  7. Class[] interfaces = clazz.getInterfaces();
  8. for(Class c : interfaces){
  9. System.out.println(c);
  10. }
  11. System.out.println();
  12. //获取运行时类的父类实现的接口
  13. Class[] interfaces1 = clazz.getSuperclass().getInterfaces();
  14. for(Class c : interfaces1){
  15. System.out.println(c);
  16. }
  17. }

获取运行时类所在的包

类所在的包Package getPackage()

  1. /*
  2. 获取运行时类所在的包
  3. */
  4. @Test
  5. public void test6(){
  6. Class clazz = Person.class;
  7. Package pack = clazz.getPackage();
  8. System.out.println(pack);
  9. }

获取运行时类声明的注解

image.png

  1. /*
  2. 获取运行时类声明的注解
  3. */
  4. @Test
  5. public void test7(){
  6. Class clazz = Person.class;
  7. Annotation[] annotations = clazz.getAnnotations();
  8. for(Annotation annos : annotations){
  9. System.out.println(annos);
  10. }
  11. }
  12. }