一、了解一下反射
二、代码解释
package reflex;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
/**
* @author :huan
* @date :2021/5/17 21:28
* @description:TODO
**/
public class reflex {
public static void main(String[] args) throws Exception {
Person testPrson=new Person();
//先获取Person的Class对象(有三种方法)
Class person1 = Class.forName("reflex.Person");//(1)将字节码文件加载进内存,返回Class对象
Class person2 =Person.class;//(2)通过类名的属性class获取
Class person3=testPrson.getClass();//(3)通过通过对象的getClass()方法获取
System.out.println(person1);
System.out.println(person2);
System.out.println(person3);
System.out.println("=============获取成员变量们=================");
//一、获取成员变量们
//1、获取所有的public修饰的成员变量
Field[] fields = person1.getFields();
for (Field field:fields){
System.out.println(field);
}
System.out.println("==============================");
//2、获取指定的成员变量id的值
Field id = person1.getField("id");
Object value = id.get(testPrson);
System.out.println("id的默认值是:"+value);
//设置id的值
id.set(testPrson,200);
System.out.println(testPrson);
System.out.println("==============================");
//3、获取所有的成员变量,不考虑修饰符
Field[] declaredFields = person1.getDeclaredFields();
for (Field field:declaredFields){
System.out.println(field);
}
//获取指定的成员变量(private修饰的成员变量也可以哦),不考虑修饰符
Field password = person1.getDeclaredField("password");
//忽略访问修饰符的检查(曰之为暴力反射)
password.setAccessible(true);
Object value2 = password.get(testPrson);
System.out.println("password的默认值是:"+value2);
System.out.println();
System.out.println("============获取构造器们==================");
constrator();
System.out.println("============获取成员方法们==================");
getmethods();
}
public static void constrator() throws Exception {
//2、获取构造器们
Person person=new Person();
Class Cperson=person.getClass();
//获取有参构造器
Constructor constructor = Cperson.getConstructor(int.class, String.class);
System.out.println(constructor);
//使用这个构造器创建对象
Object persionReflex = constructor.newInstance(22, "焕");
System.out.println(persionReflex);
System.out.println("==============================");
//获取无参的构造器
Constructor constructor1 = Cperson.getConstructor();
Object personReflex2 = constructor1.newInstance();
System.out.println(personReflex2);
//获取无参的构造器这样也更快(JDK封装好了)
Object personReflex3 = Cperson.newInstance();
System.out.println(personReflex3);
//获取私有的构造器
//Constructor declaredConstructor = Cperson.getDeclaredConstructor();
}
public static void getmethods() throws Exception {
Person person=new Person();
Class personClass=Person.class;
//3、获取指定的成员方法(无参)
Method eat = personClass.getMethod("eat");
//执行方法
eat.invoke(person);
//获取有参的成员方法(有参)
Method eat1 = personClass.getMethod("eat", String.class);
eat1.invoke(person,"草莓");
//获取私有的成员方法
Method run = personClass.getDeclaredMethod("run");
//忽略访问修饰符的检查(曰之为暴力反射)
run.setAccessible(true);
run.invoke(person);
//获取私有的成员方法(有参)
Method run1 = personClass.getDeclaredMethod("run", String.class);
run1.setAccessible(true);
run1.invoke(person,"学校");
System.out.println("============获取所有的方法==================");
//4、获取所有的方法
Method[] declaredMethods = personClass.getDeclaredMethods();
for (Method method:declaredMethods){
method.setAccessible(true);
System.out.println("方法的名称:"+method.getName());
System.out.println(method);
}
System.out.println("============获取类名==================");
//5、获取类名
String className = personClass.getName();
System.out.println(className);
}
}
package reflex;
/**
* @author :huan
* @date :2021/5/17 21:28
* @description:TODO
**/
public class Person {
public int id=1;
public int age;
private String name;
private String password="我是密码!";
public Person(){};
public Person(int age, String name) {
this.age = age;
this.name = name;
}
public void eat(){
System.out.println("eating................");
}
public void eat(String food){
System.out.println("eating................"+food);
}
private void run(){
System.out.println("running.................");
}
private void run(String address){
System.out.println("running.................in"+address);
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
@Override
public String toString() {
return "reflex.Person{" +
"id=" + id +
", age=" + age +
", name='" + name + '\'' +
", password='" + password + '\'' +
'}';
}
}