反射思维导图
使用案例
package Reflection.Work.WorkTest01;import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.Arrays;public class WorkDemo01 {public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException, InvocationTargetException, InstantiationException, IllegalAccessException {Class<?> aClass = Class.forName("Reflection.Work.WorkTest01.Student");Constructor<?> constructor = aClass.getConstructor(String.class);Constructor<?> constructor1 = aClass.getConstructor();System.out.println(constructor);System.out.println(constructor1);constructor.newInstance("888");constructor1.newInstance();Constructor<?> declaredConstructor = aClass.getDeclaredConstructor(Integer.class);System.out.println(declaredConstructor);declaredConstructor.setAccessible(true);Object o = declaredConstructor.newInstance(9898);declaredConstructor.setAccessible(false);System.out.println("---------------------Method--------");Method[] methods = aClass.getMethods();System.out.println(Arrays.toString(methods));//包括继承的Constructor<?>[] declaredConstructors = aClass.getDeclaredConstructors();System.out.println(Arrays.toString(declaredConstructors));Method speak = aClass.getMethod("speak", String.class);System.out.println(speak);Student student = (Student) aClass.newInstance();Object kkk = speak.invoke(student, "kkk");System.out.println(kkk);Field[] declaredFields = aClass.getDeclaredFields();System.out.println(Arrays.toString(declaredFields));}
}
package Reflection.Work.WorkTest01;public class Student {private String name;private Integer age;public Integer id;public String sex;public Student() {System.out.println("无参");}public String speak(String s){System.out.println(s);return s;}private String speak1(String s){System.out.println(s);return s;}private Student(Integer age){System.out.println(age);}public String getName() {return name;}public void setName(String name) {this.name = name;}public Integer getAge() {return age;}public void setAge(Integer age) {this.age = age;}public Integer getId() {return id;}public void setId(Integer id) {this.id = id;}public String getSex() {return sex;}public void setSex(String sex) {this.sex = sex;}public Student(String name) {this.name = name;System.out.println(name);System.out.println("有参");}public Student(String name, Integer age, Integer id, String sex) {this.name = name;this.age = age;this.id = id;this.sex = sex;System.out.println("有参");}
}
上面代码使用Java的反射机制来获取和操作类的信息。具体是:
Class.forName("Reflection.Work.WorkTest01.Student"):通过类的全限定名获取对应的Class对象。这里获取了名为"Reflection.Work.WorkTest01.Student"的类的Class对象。aClass.getConstructor(String.class)和aClass.getConstructor():通过Class对象获取类的构造方法。getConstructor(String.class)获取了带有一个String参数的构造方法,getConstructor()获取了无参构造方法。constructor.newInstance("888")和constructor1.newInstance():通过构造方法的实例对象来创建类的实例。newInstance("888")使用带有一个String参数的构造方法创建实例,newInstance()使用无参构造方法创建实例。aClass.getDeclaredConstructor(Integer.class)和declaredConstructor.newInstance(9898):通过Class对象获取类的私有构造方法,并通过私有构造方法创建实例。getDeclaredConstructor(Integer.class)获取了带有一个Integer参数的私有构造方法,newInstance(9898)使用私有构造方法创建实例。aClass.getMethods()和aClass.getDeclaredConstructors():通过Class对象获取类的方法和构造方法。getMethods()获取类的所有公共方法(包括继承的方法),getDeclaredConstructors()获取类的所有构造方法(包括私有构造方法)。aClass.getMethod("speak", String.class):通过Class对象获取类的指定方法。getMethod("speak", String.class)获取了名为"speak"、带有一个String参数的公共方法。speak.invoke(student, "kkk"):通过方法的实例对象来调用方法。invoke(student, "kkk")调用了类的方法"speak",并传入了一个String参数。aClass.getDeclaredFields():通过Class对象获取类的所有字段(包括私有字段)。
上面代码使用反射机制动态获取了类的构造方法、方法和字段,并通过反射调用了类的构造方法和方法。通过反射,可以在运行时动态地获取和操作类的信息,提供了更大的灵活性和扩展性。