一.什么是反射机制?
这里我首先粘贴一下百度百科上的解释:JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意方法和属性;这种动态获取信息以及动态调用对象方法的功能称为java语言的反射机制。
在百度百科后面还说了Class对象与反射之间的关系:
1 2 3 4 5 6 7 8 9 | public final class Class<T> implements Serializable, java.lang.reflect.GenericDeclaration, java.lang.reflect.Type, java.lang.reflect.AnnotatedElement { private Class() {} public String toString() { return ( isInterface() ? "interface " : (isPrimitive() ? "" : "class " )) + getName(); } |
由于class 对象是由final来修饰的,也就是说class对象是不能被继承且只能由jvm生成唯一一个。
在这里就开始了解到其实反射机制是通过jvm加载一个类生成的class文件,解析出这个对象保存了什么信息,方法名,参数等等的信息。
class文件的头4个字节称为魔数,它的唯一作用就是确定这个文件时候是一个能被虚拟机接受的class文件。所以你看到了蛋糕宝贝(cafebabe)证明他能被虚拟机接受。很多图片格式都用一个魔数来标识文件类型,比如png和jpg等。在java的class文件中,这个数是0xcafebabe。
接下来就是class文件的版本号,第5、6个字节是次版本号,第7、8个字节是主版本号。在这里,次版本号是0,主版本号是52,(十六进制是34)。Java的版本号是从45开始的,JDK1.1之后的每一个JDK大版本发布主版本号向上加1,高版本的JDK能向下兼容低版本的JDK。
在这里我借鉴了其他博主弄的一张图,在这张图里面很好的解释了类与class,jvm在加载过程的关系。
1.当我们运行new一个对象时,jvm就会到我们本地磁盘中寻找对象的class文件并加载到jvm内存中。
2.在jvm内存中,.class文件读入内存后,生成一个对象空间,同时在jvm生成这个对象有且唯一的class对象-(Class
has no public constructor. Instead Class
objects are constructed automatically by the Java Virtual Machine as classes are loaded and by calls to the defineClass
method in the class loader;翻译:class没有公共构造方法,但class对象会在加载时被jvm用类加载器用defineClass 方法自动构造)
二反射的使用
反射的获取类
public static void main(String[] args){
//反射的三种方式
//1.通过名字获取class
try {
Class class1= Class.forName("Person");
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
//2.object下的getCLASS方法
Person p= new Person();
Class class2= p.getClass();
//3.类下.class属性
Class class3 = Person.class;
}