1. package com.atguigu.java3;
    2. import com.atguigu.java2.Person;
    3. import org.junit.Test;
    4. import java.lang.reflect.Constructor;
    5. import java.lang.reflect.Field;
    6. import java.lang.reflect.Method;
    7. /**
    8. * 调用运行时类中指定的结构:属性、方法、构造器
    9. *
    10. * @author Dxkstart
    11. * @create 2021-06-07 20:48
    12. */
    13. public class ReflectionTest {
    14. /*
    15. 不需要掌握
    16. */
    17. @Test
    18. public void testField() throws Exception{
    19. Class<Person> clazz = Person.class;
    20. //创建运行时类的对象
    21. Person p = clazz.newInstance();
    22. //获取指定的属性: 要求运行时类中属性声明为public
    23. //通常不采用此方法
    24. Field id = clazz.getField("id");
    25. /*
    26. 设置当前属性的值
    27. set():参数1:指明设置那个对象的属性 参数2:将此属性值设置为多少
    28. */
    29. id.set(p,1001);
    30. /*
    31. 获取当前属性的值
    32. get():参数1:获取哪个对象的当前属性值
    33. */
    34. int pId =(int) id.get(p);
    35. System.out.println(pId);
    36. }
    37. /*
    38. 如何操作运行时类中指定的属性 --- 需要掌握
    39. */
    40. @Test
    41. public void testFiled1() throws Exception{
    42. Class<Person> clazz = Person.class;
    43. //创建运行时类的对象
    44. Person p = clazz.newInstance();
    45. //1.getDeclaredField(String fieldName):获取运行时类中指定变量名的属性
    46. Field name = clazz.getDeclaredField("name");
    47. //2.保证当前属性是可访问的
    48. name.setAccessible(true);
    49. //3.获取、设置指定对象的此属性值
    50. name.set(p,"Tom");
    51. System.out.println(name.get(p));
    52. }
    53. /*
    54. 如何操作运行时类中指定的方法 --- 需要掌握
    55. */
    56. @Test
    57. public void testMethod() throws Exception{
    58. Class<Person> clazz = Person.class;
    59. //创建运行时类的对象
    60. Person p = clazz.newInstance();
    61. /*
    62. 1.获取指定的某个方法
    63. getDeclaredMethod():参数1:指明获取的方法的名称 参数2:指明获取的方法的形参列表
    64. */
    65. Method show = clazz.getDeclaredMethod("show", String.class);
    66. //2.保证当前方法是可访问的
    67. show.setAccessible(true);
    68. /*
    69. 3.invoke():参数1:方法的调用者 参数2:给方法形参赋值的实参
    70. invoke()的返回值即为对应类中调用的方法的返回值。
    71. */
    72. Object chn = show.invoke(p, "CHN");//String nation = p.show("CHN")
    73. System.out.println(chn);
    74. System.out.println("**********如何调用静态方法***********");
    75. //private static void showDesc()
    76. Method showDesc = clazz.getDeclaredMethod("showDesc");
    77. showDesc.setAccessible(true);
    78. //如果调用的运行时类中的方法没有返回值,则此invoke()返回null
    79. Object invoke = showDesc.invoke(Person.class);
    80. System.out.println(invoke);//null
    81. }
    82. /*
    83. 如何调用运行时类中的指定的构造器
    84. */
    85. @Test
    86. public void testConstructor() throws Exception{
    87. Class<Person> clazz = Person.class;
    88. //private Person(String name)
    89. /*
    90. 1.获取指定的构造器
    91. getDeclaredConstructor():参数:指明构造器的参数列表
    92. */
    93. Constructor<Person> constructor = clazz.getDeclaredConstructor(String.class);
    94. //2.保证此构造器是可访问的
    95. constructor.setAccessible(true);
    96. //3.调用此构造器创建运行时类的对象
    97. Person tom = constructor.newInstance("Tom");
    98. System.out.println(tom);
    99. }
    100. }