1、调用运行时类中的指定属性

1.1、Person类

  1. package github2;
  2. @MyAnnotation(value="java")
  3. public class Person extends Creature<String> implements Comparable<String>,MyInterface{
  4. private String name;
  5. int age;
  6. public int id;
  7. public Person() {
  8. }
  9. @MyAnnotation(value="C++")
  10. Person(String name){
  11. this.name = name;
  12. }
  13. private Person(String name,int age){
  14. this.name = name;
  15. this.age = age;
  16. }
  17. @MyAnnotation
  18. private String show(String nation){
  19. System.out.println("我来自" + nation + "星系");
  20. return nation;
  21. }
  22. @Override
  23. public void info() {
  24. System.out.println("火星喷子");
  25. }
  26. public String display(String interests,int age) throws Exception{
  27. return interests + age;
  28. }
  29. @Override
  30. public int compareTo(String o) {
  31. return 0;
  32. }
  33. @Override
  34. public String toString() {
  35. return "Person{" +
  36. "name='" + name + '\'' +
  37. ", age=" + age +
  38. ", id=" + id +
  39. '}';
  40. }
  41. }

1.2、测试类

  1. package github3;
  2. import github2.Person;
  3. import org.junit.Test;
  4. import java.lang.reflect.Field;
  5. /**
  6. * 调用运行时类中指定的结构:属性、方法、构造器
  7. */
  8. public class ReflectionTest {
  9. /**
  10. * 不需要掌握
  11. */
  12. @Test
  13. public void testField() throws Exception {
  14. Class clazz = Person.class;
  15. //创建运行时类的对象
  16. Person p = (Person) clazz.newInstance();
  17. //获取指定的属性:要求运行时类中属性声明为public
  18. //通常不采用此方法
  19. Field id = clazz.getField("id");
  20. //设置当前属性的值
  21. //set():参数1:指明设置哪个对象的属性 参数2:将此属性值设置为多少
  22. id.set(p,1001);
  23. //获取当前属性的值
  24. //get():参数1:获取哪个对象的当前属性值
  25. int pId = (int) id.get(p);
  26. System.out.println(pId);
  27. }
  28. /**
  29. * 如何操作运行时类中的指定的属性 -- 需要掌握
  30. */
  31. @Test
  32. public void testField1() throws Exception {
  33. Class clazz = Person.class;
  34. //创建运行时类的对象
  35. Person p = (Person) clazz.newInstance();
  36. //1. getDeclaredField(String fieldName):获取运行时类中指定变量名的属性
  37. Field name = clazz.getDeclaredField("name");
  38. //2.保证当前属性是可访问的
  39. name.setAccessible(true);
  40. //3.获取、设置指定对象的此属性值
  41. name.set(p,"Jam");
  42. System.out.println(name.get(p));
  43. }
  44. }

2、调用运行时类中的指定方法

getDeclaredMethod():
参数1 :指明获取的方法的名称 参数2:指明获取的方法的形参列表
调用方法的invoke():
参数1:方法的调用者 参数2:给方法形参赋值的实参
invoke()的返回值即为对应类中调用的方法的返回值。

  1. package github3;
  2. import github2.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. public class ReflectionTest {
  11. /**
  12. * 如何操作运行时类中的指定的方法 -- 需要掌握
  13. */
  14. @Test
  15. public void testMethod() throws Exception {
  16. Class clazz = Person.class;
  17. //创建运行时类的对象
  18. Person p = (Person) clazz.newInstance();
  19. //1.获取指定的某个方法
  20. //getDeclaredMethod():参数1 :指明获取的方法的名称 参数2:指明获取的方法的形参列表
  21. Method show = clazz.getDeclaredMethod("show", String.class);
  22. //2.保证当前方法是可访问的
  23. show.setAccessible(true);
  24. //3.调用方法的invoke():参数1:方法的调用者 参数2:给方法形参赋值的实参
  25. //invoke()的返回值即为对应类中调用的方法的返回值。
  26. Object returnValue = show.invoke(p,"CCA"); //String nation = p.show("CCA");
  27. System.out.println(returnValue);
  28. System.out.println("+++++++++如何调用静态方法+++++++++++");
  29. // private static void showDesc()
  30. Method showDesc = clazz.getDeclaredMethod("showDown");
  31. showDesc.setAccessible(true);
  32. //如果调用的运行时类中的方法没有返回值,则此invoke()返回null
  33. // Object returnVal = showDesc.invoke(null);
  34. Object returnVal = showDesc.invoke(Person.class);
  35. System.out.println(returnVal);//null
  36. }
  37. }

3、调用运行时类中的指定构造器

  1. import github2.Person;
  2. import org.junit.Test;
  3. import java.lang.reflect.Constructor;
  4. import java.lang.reflect.Field;
  5. import java.lang.reflect.Method;
  6. /**
  7. * 调用运行时类中指定的结构:属性、方法、构造器
  8. */
  9. public class ReflectionTest {
  10. /**
  11. * 如何调用运行时类中的指定的构造器
  12. */
  13. @Test
  14. public void testConstructor() throws Exception {
  15. Class clazz = Person.class;
  16. //private Person(String name)
  17. //1.获取指定的构造器
  18. //getDeclaredConstructor():参数:指明构造器的参数列表
  19. Constructor constructor = clazz.getDeclaredConstructor(String.class);
  20. //2.保证此构造器是可访问的
  21. constructor.setAccessible(true);
  22. //3.调用此构造器创建运行时类的对象
  23. Person per = (Person) constructor.newInstance("Tom");
  24. System.out.println(per);
  25. }
  26. }