Java反射
什么是反射?
反射允许对成员变量,成员方法和构造方法的信息进行编程访问,利用反射我们可以获取到类里面的所有信息
获取class对象的三种方式
● Class.forName(“全类名”);
● 类名.class
● 对象.getClass();
```java
public class ReflectDemo1 {
public static void main(String[] args) throws ClassNotFoundException {
// 第一种方式
Class clazz = Class.forName("Student");
System.out.println(clazz);
// 第二种方式
Class studentClass = Student.class;
System.out.println(studentClass);
System.out.println(clazz == studentClass);
// 第三种方式
Student S = new Student();
Class aClass = S.getClass();
System.out.println(aClass);
}
}
获取构造方法
public class Student {
private String name;
private int age;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
private Student(String name, int age) {
this.name = name;
this.age = age;
}
public Student() {
}
public Student(String name) {
this.name = name;
}
protected Student(int age) {
this.age = age;
}
@Override
public String toString() {
return "Student{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
}
import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Parameter;
public class ReflectDemo1 {
public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException, InvocationTargetException, InstantiationException, IllegalAccessException {
Class student = Class.forName("Student");
// 获取构造方法
Constructor[] constructors = student.getConstructors();
for (Constructor constructor : constructors) {
System.out.println(constructor);
}
//
Constructor[] declaredConstructors = student.getDeclaredConstructors();
for (Constructor declaredConstructor : declaredConstructors) {
System.out.println(declaredConstructor);
}
Constructor declaredConstructor = student.getDeclaredConstructor();
System.out.println(declaredConstructor);
Constructor declaredConstructor1 = student.getDeclaredConstructor(String.class);
System.out.println(declaredConstructor1);
Constructor declaredConstructor2 = student.getDeclaredConstructor(int.class);
System.out.println(declaredConstructor2);
Constructor declaredConstructor3 = student.getDeclaredConstructor(String.class, int.class);
System.out.println(declaredConstructor3);
int modifiers = declaredConstructor3.getModifiers();
System.out.println(modifiers);
Parameter[] parameters = declaredConstructor3.getParameters();
for (Parameter parameter : parameters) {
System.out.println(parameter);
}
// 临时取消权限校验
declaredConstructor3.setAccessible(true);
Student ssp = (Student) declaredConstructor3.newInstance("ssp", 22);
System.out.println(ssp);
}
}
获取成员变量
import java.lang.reflect.Field;
public class ReflectDemo1 {
public static void main(String[] args) throws ClassNotFoundException, NoSuchFieldException, IllegalAccessException {
Class<?> student = Class.forName("Student");
Field[] fields = student.getFields();
for (Field field : fields) {
System.out.println(field);
}
Field[] declaredFields = student.getDeclaredFields();
for (Field declaredField : declaredFields) {
System.out.println(declaredField);
}
// 获取单个成员变量
Field gender = student.getField("gender");
System.out.println(gender);
// 获取成员变量名
String name = gender.getName();
System.out.println(name);
// 获取成员修饰符
int modifiers = gender.getModifiers();
System.out.println(modifiers);
// 获取成员变量数据类型
Class<?> type = gender.getType();
System.out.println(type);
// 获取成员变量记录的值
Student ssp = new Student("ssp", 23, "男");
Object o = gender.get(ssp);
System.out.println(o);
// 修改对象里面记录的值
gender.set(ssp, "女");
System.out.println(ssp);
}
}
获取成员方法
package reflect4;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.lang.reflect.Parameter;
public class ReflectDemo1 {
public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException, InvocationTargetException, IllegalAccessException {
Class<?> aClass = Class.forName("reflect4.Student");
Method[] methods = aClass.getMethods();
for (Method method : methods) {
System.out.println(method);
}
// 获取指定单一方法
Method sleep = aClass.getMethod("sleep");
System.out.println(sleep);
Method eat = aClass.getDeclaredMethod("eat", String.class);
System.out.println(eat);
// 获取方法的修饰符
int modifiers = eat.getModifiers();
System.out.println(modifiers);
// 获取方法的名字
String name = eat.getName();
System.out.println(name);
// 获取方法的形参
Parameter[] parameters = eat.getParameters();
for (Parameter parameter : parameters) {
System.out.println(parameter);
}
// 获取方法抛出的异常
Class<?>[] exceptionTypes = eat.getExceptionTypes();
for (Class<?> exceptionType : exceptionTypes) {
System.out.println(exceptionType);
}
/*
* 方法运行
* Method类中用于创建对象的方法
* 参数1 用obj调用该方法
* 参数2 调用方法传递的参数
* 返回值 方法的返回值
* */
Student student = new Student();
eat.setAccessible(true);
String res = (String) eat.invoke(student, "汉堡包");
System.out.println(res);
Method eat1 = aClass.getDeclaredMethod("eat", String.class);
eat1.setAccessible(true);
Student student1 = new Student();
String res1 = (String) eat1.invoke(student1, "牛肉");
System.out.println(res1);
}
}