什么是反射机制?
在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意方法和属性;这种动态获取信息以及动态调用对象方法的功能称为java语言的反射机制。
说白了就是,有一个程序已经在运行了,但是运行中间你想知道某一个类的详细信息。
第一反应,那我(人)直接在Project的文件里找到对应的类点开看看这个类的定义(.java文件)不就完事了。我这样也算是动态获取了信息。
就java而言肯定不可能这么做,那么java是如何动态获取的呢?就是反射机制了。
我们在idea里写的都是.java文件,但是经过编译.java文件就变成了.class文件,然后程序运行前这些.class文件会经历一个类加载过程(类加载->类的连接(验证->准备->解析)->类的初始化)然后就会被使用了。
在类加载这个阶段,在内存中会生成一个代表这个类的java.lang.Class对象,这个对象就是反射机制的关键。
我(人) idea .java文件
Java程序 内存 Class对象
public class Person{
//属性
private String name;
private String age;
private String sex;
public String country;
public String getCountry() {
return country;
}
public void setCountry(String country) {
this.country = country;
}
//构造器
public Person(String name, String age, String sex) {
this.name = name;
this.age = age;
this.sex = sex;
}
//方法
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getAge() {
return age;
}
public void setAge(String age) {
this.age = age;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
protected void eat(String food){
System.out.println("吃饭:"+food);
}
}
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.lang.reflect.Parameter;
public class Main {
public static void main(String[] args) {
Person person = new Person("小明", "18", "男");
Class clazz = person.getClass();
System.out.println(clazz.getSimpleName());
//获取所有属性
System.out.println("==获取所有属性==");
Field[] fields = clazz.getDeclaredFields();
for (Field f : fields) {
System.out.println(f.getName() + ":" + f.getType().getName());
}
//获取public属性
System.out.println("==获取public属性==");
Field[] fieldsNotPrivate = clazz.getFields();
for (Field f : fieldsNotPrivate) {
System.out.println(f.getName() + ":" + f.getType().getName());
}
//获取所有public方法
System.out.println("==获取所有public方法==");
Method[] methods=clazz.getMethods();
for (Method i : methods) {
System.out.println(i.getName() + ":" + i.getReturnType().getName());
}
//获取所有方法
System.out.println("==获取所有方法==");
Method[] methods1=clazz.getDeclaredMethods();
for (Method i : methods1) {
System.out.println(i.getName() + ":" + i.getReturnType().getName());
//获取参数
{
Parameter[] parameters = i.getParameters();
for (Parameter p : parameters) {
System.out.println(p.getName() + ":" + p.getType().getName());
}
}
}
}
}