一、什么是反射机制
反射机制(Reflection)是Java语言中一个非常重要的特性,它允许程序在运行时进行自我检查,同时也允许对其内部的成员进行操作。反射的概念是由Smith在1982年首次提出的,主要是指程序可以访问、检测和修改其本身状态或行为的一种能力。
二、反射的作用
1. 反编译:.class —>.java
2. 通过反射机制访问java对象的属性、方法、构造方法等;
三、反射机制的运用
反射机制的一些包
1. Class类:代表一个类。
2. Filed类:代表类的成员变量。
3. Method类:代表类的方法。
4. Constructor类:代表类的构造方法。如图:

反射中在运行阶段获取其Class对象(原生所在类)
1. 实例.getClass
2. 类名.Class
3. Class.forName("类的路径")。如图:

上述三种哪种相对好一点?(当然是第三种更能体现反射本身)

根据类名获取类中定义的所有属性、方法和构造方法 示例如下:
package pojo;
/**
* 狗狗类
*/
public class Dog {
//定义了三个属性
private int id; //私有的属性
int age; //默认的属性
public String name; //公有的属性
//三个方法
private void eat(){ //私有的方法
System.out.println("吃的方法");
}
void sleep(){ //默认的方法
System.out.println("小狗爱睡觉");
}
public void jiao(){ //公有的方法
System.out.println("小狗会叫");
}
}
package test;
/**
* 测试类
*/
import pojo.Dog;
import java.lang.Class;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
public class Test {
public static void main(String[] args) throws ClassNotFoundException, InstantiationException, IllegalAccessException {
Dog d = new Dog();
//第一种 通过已有对象 来反向获取Class类
Class clazz = d.getClass();
//获取方法
Method[] methods = clazz.getMethods(); //获取该类中所有的方法 包括继承来的
for (Method m : methods) {
System.out.println(m.getName()); //获取方法名
//输出结果 jiao wait wait wait equals toString hashCode getClass notify notifyAll
}
System.out.println("-------------------------");
//获取本类自己声明的方法 包括私有 被保护的
Method[] method = clazz.getDeclaredMethods();
for (Method m : method) {
System.out.println(m.getName()); //获取方法名
//输出结果 sleep jiao eat
}
System.out.println("**************************");
//获取反射类中的成员变量(属性)
Field[] fields = clazz.getFields(); //获取所有公开的成员变量 包括继承来的
for (Field f : fields) {
System.out.println(f.getName()); //输出 name
}
System.out.println("-------------------------");
Field[] field = clazz.getDeclaredFields(); //获取所有自己声明的成员变量
for (Field f : field) {
System.out.println(f.getName()); //输出 id age name
}
System.out.println("***************************");
//获取构造方法
Constructor[] constructors = clazz.getConstructors(); //获取所能访问到的 包括继承父类的
for (Constructor c : constructors) {
System.out.println(c.getName()); //获取方法名 输出 pojo.Dog
}
System.out.println("----------------------------");
Constructor[] constructor = clazz.getDeclaredConstructors(); //只有自己定义的构造方法
for (Constructor c : constructor) {
System.out.println(c.getName()); //输出pojo.Dog
}