• java反射的使用


     

    数据准备 

    自定义注解

    1. import java.lang.annotation.Retention;
    2. import java.lang.annotation.RetentionPolicy;
    3. import java.lang.annotation.Target;
    4. import static java.lang.annotation.ElementType.*;
    5. @Target({TYPE,FIELD,METHOD,PARAMETER,CONSTRUCTOR,LOCAL_VARIABLE})
    6. @Retention(RetentionPolicy.RUNTIME)
    7. public @interface MyAnnotation {
    8. String value() default "hello";
    9. }

     自定义接口

    1. public interface MyInterface {
    2. void info();
    3. }

    带泛型的父类

    1. public class Creature<T> implements Serializable {
    2. private char gender;
    3. public double weight;
    4. private void breath() {
    5. System.out.println("生物呼吸");
    6. }
    7. private void eat() {
    8. System.out.println("生物吃东西");
    9. }
    10. }

    子类Person类

    1. import java.util.Comparator;
    2. @MyAnnotation(value = "hi")
    3. public class Person extends Creature<String> implements Comparator<String> ,MyInterface{
    4. private String name;
    5. int age;
    6. public int id;
    7. public Person() {
    8. super();
    9. }
    10. private Person(String name) {
    11. this.name=name;
    12. }
    13. @MyAnnotation(value="abc")
    14. public Person(String name, int age, int id) {
    15. super();
    16. this.name = name;
    17. this.age = age;
    18. this.id = id;
    19. }
    20. @MyAnnotation
    21. private String show(String nation) {
    22. System.out.println("我的国籍是:"+nation);
    23. return nation;
    24. }
    25. public String display(String interests,int age)
    26. throws NullPointerException,ClassCastException{
    27. return interests+age;
    28. }
    29. @Override
    30. public void info() {
    31. System.out.println("我是一个人");
    32. }
    33. @Override
    34. public int compare(String o1, String o2) {
    35. return 0;
    36. }
    37. private static void showDesc() {
    38. System.out.println("我是一个可爱的人");
    39. }
    40. @Override
    41. public String toString() {
    42. return "Person [name=" + name + ", age=" + age + ", id=" + id + "]";
    43. }
    44. }

    测试类

    FieldTest:获取当前运行时类的属性结构

    1. import java.lang.reflect.Field;
    2. import java.lang.reflect.Modifier;
    3. import org.junit.jupiter.api.Test;
    4. import reflect.java2.Person;
    5. /**
    6. * 获取当前运行时类的属性结构
    7. * @author CharlieLiang
    8. *
    9. */
    10. public class FieldTest {
    11. @Test
    12. public void test() {
    13. Class clazz = Person.class;
    14. //获取属性结构
    15. // getFields():获取当前运行时类及其父类中声明为public访问权限的属性
    16. System.out.println("--getFields()--");
    17. Field[] fs= clazz.getFields();
    18. for(Field f: fs) {
    19. System.out.println(f);
    20. }
    21. System.out.println("---getDeclaredFields()----");
    22. //getDeclaredFields():获取当前类的所有属性,不包含父类
    23. Field[] fs2 = clazz.getDeclaredFields();
    24. for(Field f:fs2) {
    25. System.out.println(f);
    26. }
    27. }
    28. // 权限修饰符 数据类型 变量名
    29. @Test
    30. public void test2() {
    31. Class clazz = Person.class;
    32. Field[] fs = clazz.getDeclaredFields();
    33. for(Field f:fs) {
    34. //1. 权限修饰符 0:默认修饰符,modifer是数字,把数字转为修饰符名字
    35. int modifiers = f.getModifiers();
    36. System.out.print(Modifier.toString(modifiers)+"\t");
    37. //2. 数据类型
    38. Class type=f.getType();
    39. System.out.print(type.getName()+"\t");
    40. // 3.变量名
    41. String fName=f.getName();
    42. System.out.print(fName);
    43. System.out.println();
    44. }
    45. }
    46. }

    运行结果:

    test

    test2

     MehtodTest:获取运行时类的方法

    1. import java.lang.annotation.Annotation;
    2. import java.lang.reflect.Method;
    3. import java.lang.reflect.Modifier;
    4. import org.junit.jupiter.api.Test;
    5. import reflect.java2.Person;
    6. /**
    7. * 获取运行时类的方法的使用
    8. * @author CharlieLiang
    9. *
    10. */
    11. public class MethodTest {
    12. @Test
    13. public void test() {
    14. Class clazz=Person.class;
    15. //getMethods():获取当前类及其所有父类中声明为public权限的方法
    16. System.out.println("-----------getMethods()-----------------");
    17. Method[] mds = clazz.getMethods();
    18. for(Method md:mds) {
    19. System.out.println(md);
    20. }
    21. System.out.println("-----------getDeclaredMethods()------------");
    22. // 获取当前类的声明的方法(不包含父类)
    23. Method[] dmds = clazz.getDeclaredMethods();
    24. for(Method md:dmds) {
    25. System.out.println(md);
    26. }
    27. }
    28. /**
    29. * @XXX
    30. * 权限修饰符 返回值类型 方法名(参数类型1 形参名1,....) throws XxxException()
    31. */
    32. @Test
    33. public void test2() {
    34. Class clazz=Person.class;
    35. Method[] dmds = clazz.getDeclaredMethods();
    36. for(Method md:dmds) {
    37. //获取注解
    38. Annotation[] annos = md.getAnnotations();
    39. for(Annotation a: annos) {
    40. System.out.println(a);
    41. }
    42. //2 .权限修饰符
    43. System.out.print(Modifier.toString(md.getModifiers())+"\t");
    44. //3. 返回值类型 getReturnType()-->class java.lang.String
    45. // getReturnType().getName()-->java.lang.String
    46. System.out.print(md.getReturnType().getName()+"\t");
    47. System.out.print(md.getName());
    48. System.out.print("(");
    49. //5. 形参列表
    50. Class<?>[] parameterTypes = md.getParameterTypes();
    51. if(!((parameterTypes==null)&&(parameterTypes.length==0))) {
    52. for(int i=0;i<parameterTypes.length;i++) {
    53. if(i==parameterTypes.length-1) {
    54. System.out.print(parameterTypes[i].getName()+" arg_"+i);
    55. break;
    56. }
    57. System.out.print(parameterTypes[i].getName()+" arg_"+i+",");
    58. }
    59. }
    60. System.out.print(")");
    61. //6.异常
    62. Class<?>[] exceptionTypes = md.getExceptionTypes();
    63. if(exceptionTypes.length>0) {
    64. System.out.print("throws ");
    65. for(int i=0;i<exceptionTypes.length;i++) {
    66. if(i== exceptionTypes.length-1) {
    67. System.out.print(exceptionTypes[i].getName());
    68. break;
    69. }
    70. System.out.print(exceptionTypes[i].getName()+",");
    71. }
    72. }
    73. System.out.println();
    74. }
    75. }
    76. }

    OtherTest:其他测试

    1. import java.lang.annotation.Annotation;
    2. import java.lang.reflect.Constructor;
    3. import java.lang.reflect.ParameterizedType;
    4. import java.lang.reflect.Type;
    5. import org.junit.jupiter.api.Test;
    6. import reflect.java2.Person;
    7. /**
    8. *
    9. * @author CharlieLiang
    10. *
    11. */
    12. public class OtherTest {
    13. /**
    14. * 获取构造器结构
    15. */
    16. @Test
    17. public void test() {
    18. Class clazz=Person.class;
    19. Constructor[] constructors = clazz.getConstructors();
    20. System.out.println("----------getConstructors()--------------");
    21. // getConstructors():获取当前运行时类声明为public的构造器
    22. for(Constructor c: constructors) {
    23. System.out.println(c);
    24. }
    25. // getDeclaredConstructors():获取当前运行时类中声明的所有构造器
    26. System.out.println("---------getDeclaredConstructors()-----------");
    27. Constructor[] declaredConstructors = clazz.getDeclaredConstructors();
    28. for(Constructor c:declaredConstructors) {
    29. System.out.println(c);
    30. }
    31. }
    32. /**
    33. * 获取运行时类的父类
    34. */
    35. @Test
    36. public void test2() {
    37. Class clazz=Person.class;
    38. Class superclass = clazz.getSuperclass();
    39. System.out.println(superclass);
    40. }
    41. /**
    42. * 获取运行时类的带泛型的父类
    43. */
    44. @Test
    45. public void test3() {
    46. Class clazz=Person.class;
    47. Type genericSuperclass = clazz.getGenericSuperclass();
    48. System.out.println(genericSuperclass);
    49. }
    50. /**
    51. * 获取运行时类的父类的泛型
    52. */
    53. @Test
    54. public void test4() {
    55. Class clazz=Person.class;
    56. Type genericSuperclass = clazz.getGenericSuperclass();
    57. ParameterizedType paramType=(ParameterizedType) genericSuperclass;
    58. //获取泛型类型
    59. Type[] actualTypeArguments = paramType.getActualTypeArguments();
    60. System.out.println(actualTypeArguments[0]);
    61. System.out.println(actualTypeArguments[0].getTypeName());
    62. }
    63. /**
    64. * 获取运行时类的接口
    65. */
    66. @Test
    67. public void test5() {
    68. Class clazz = Person.class;
    69. Class[] interfaces = clazz.getInterfaces();
    70. for(Class c: interfaces) {
    71. System.out.println(c);
    72. }
    73. System.out.println();
    74. Class[] interfaces2 = clazz.getSuperclass().getInterfaces();
    75. for(Class c: interfaces2) {
    76. System.out.println(c);
    77. }
    78. }
    79. /**
    80. * 获取运行时类所在的包
    81. */
    82. @Test
    83. public void test6() {
    84. Class clazz = Person.class;
    85. Package pack = clazz.getPackage();
    86. System.out.println(pack);
    87. }
    88. /**
    89. * 获取运行时类所在的注解
    90. */
    91. @Test
    92. public void test7() {
    93. Class clazz = Person.class;
    94. Annotation[] as = clazz.getAnnotations();
    95. for(Annotation aaa:as) {
    96. System.out.println(aaa);
    97. }
    98. }
    99. }

    ReflectionTest:调用运行时类指定的结构: 属性,方法,构造器 

    1. import java.lang.reflect.Constructor;
    2. import java.lang.reflect.Field;
    3. import java.lang.reflect.Method;
    4. import org.junit.jupiter.api.Test;
    5. import reflect.java2.Person;
    6. /**
    7. * 调用运行时类指定的 结构: 属性,方法,构造器
    8. * @author CharlieLiang
    9. *
    10. */
    11. public class ReflectionTest {
    12. @Test
    13. public void testField() throws Exception {
    14. Class clazz=Person.class;
    15. //创建运行时类对象
    16. Person p= (Person) clazz.newInstance();
    17. //获取指定的属性getField():获取public变量
    18. Field id= clazz.getField("id");
    19. id.set(p, 1001);
    20. //获取当前属性的值
    21. int pid = (int) id.get(p);
    22. System.out.println(pid);
    23. }
    24. /**
    25. * 如何操作运行时类中的指定属性 -- 需要掌握
    26. * @throws Exception
    27. */
    28. @Test
    29. public void testField2() throws Exception {
    30. Class clazz=Person.class;
    31. //创建运行时类对象
    32. Person p= (Person) clazz.newInstance();
    33. //获取指定的属性getField():获取public变量
    34. //私有变量name
    35. Field name= clazz.getDeclaredField("name");
    36. //保证当前属性是可访问的
    37. name.setAccessible(true);
    38. //获取、设置指定对象的此属性值
    39. //set(对象,参数)
    40. name.set(p, "Jerry");
    41. System.out.println(name.get(p));
    42. }
    43. /**
    44. * 如何操作运行时类中的指定方法 -- 需要掌握
    45. *
    46. */
    47. @Test
    48. public void testField3() throws Exception {
    49. Class clazz=Person.class;
    50. //创建运行时类对象
    51. Person p= (Person) clazz.newInstance();
    52. //getDeclaredMethod(方法名,参数列表)
    53. Method show=clazz.getDeclaredMethod("show", String.class);
    54. show.setAccessible(true);
    55. //invoke(对象,参数列表),invoke有方法返回值
    56. Object returnVal = show.invoke(p, "CHN");
    57. System.out.println("返回值"+returnVal);
    58. System.out.println("----如何调用静态方法-------");
    59. //private static void showDesc()
    60. Method showDesc=clazz.getDeclaredMethod("showDesc");
    61. showDesc.setAccessible(true);
    62. //showDesc:无参数,void型的invoke返回null
    63. Object returnval2 = showDesc.invoke(Person.class);
    64. System.out.println("返回值:"+returnval2);
    65. }
    66. /**
    67. * 如何操作运行时类中的指定构造器
    68. * @throws Exception
    69. * @throws
    70. *
    71. */
    72. @Test
    73. public void testField4() throws Exception {
    74. Class clazz=Person.class;
    75. //getDeclaredConstructor():指明参数列表
    76. Constructor cons =clazz.getDeclaredConstructor(String.class);
    77. cons.setAccessible(true);
    78. //用构造器创建运行时类的对象
    79. Person person = (Person) cons.newInstance("Jack");
    80. System.out.println(person);
    81. }
    82. }

  • 相关阅读:
    Gin学习记录4——Controller和中间件
    GAMES101 作业0 环境配置 超详细小白教程
    携职教育:《会计类考证》报考要求与攻略
    城市旅游景点信息交流平台的设计与实现 毕业设计-附源码290915
    commet与websocket
    Angular自定义异步表单验证
    【Python游戏】Python基于pygame实现的人机大战的斗兽棋小游戏 | 附源码
    C++:适配器
    创建ES索引
    Tips--lib静态库调用外部函数
  • 原文地址:https://blog.csdn.net/m0_46306264/article/details/125565662