反射是Java中的一种特性,能够从class中获取该实例化对象的信息包括方法以及属性。
通俗点来讲:我们使用类的时候通常是这个顺序:
import 该类 —> 实例化该类【使用 new 关键字】–>使用其方法
而反射是
获取实例化Class对象 —> 使用其方法或者获取其信息
就是可以通过已实例化的Class对象获取对应的类的属性、方法、包等信息
用个示例来讲就是:顺着来是需要找到你的家package
,然后再在你的家找到你,然后反过来就是,我知道了你的名字【包.类
】就能把你的所有信息都搞到【这样讲就有点像推理的感觉】
反射主要用到的类就是Class、Constructor[构造器]、Method[方法]、Field[属性],后面三种都可以通过Class获得
Class类
public final class Class<T> implements Serializable, GenericDeclaration, Type, AnnotatedElement
这个类可以获取类的源信息,这个类使用泛型,避免所谓的向下转型
Class:三种实例化方式
1)使用Object类的实例化对象的getClass()方法来获取
Food
package javabase.entity;
public class Food {
public Food(){
System.out.println("====又一餐美味的享受====");
}
}
Main
package javabase;
import javabase.entity.Food;
public class Main {
public static void main(String[] args) {
Food food = new Food();
Class clazz = food.getClass();
System.out.println(clazz.getName());
}
}
运行结果
====又一餐美味的享受====
javabase.entity.Food
2)使用jvm里直接支持的【类.class】
Main
package javabase;
import javabase.entity.Food;
public class Main {
public static void main(String[] args) {
Class clazz = Food.class;
System.out.println(clazz.getName());
}
}
运行结果,由于没有实例化Food对象,所以并没有执行构造方法
javabase.entity.Food
3)Class类支持:一个static方法 —forName
可以减少import语句,直接使用字符串来进行创建类的实例
public static Class<?> forName(String var0) throws ClassNotFoundException
Main
package javabase;
public class Main {
public static void main(String[] args) {
Class clazz = null;
try {
clazz = Class.forName("javabase.entity.Food");
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
System.out.println(clazz.getName());
}
}
运行结果:同样是没有执行Food的构造方法,但不需要导入包了,直接把类的路径放在 forName
方法就行
javabase.entity.Food