反射机制学习之路


一.什么是反射机制?

这里我首先粘贴一下百度百科上的解释:JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意方法和属性;这种动态获取信息以及动态调用对象方法的功能称为java语言的反射机制。

在百度百科后面还说了Class对象与反射之间的关系:

众所周知Java有个Object 类,是所有Java 类的继承根源,其内声明了数个应该在所有Java 类中被改写的方法:hashCode()、equals()、clone()、toString()、getClass()等。其中getClass()返回一个Class 对象。
Class 类十分特殊。它和一般类一样继承自Object,其实体用以表达Java程序运行时的classes和interfaces,也用来表达enum、array、primitive Java types(boolean, byte, char, short, int, long, float, double)以及关键词void。当一个class被加载,或当加载器(class loader)的defineClass()被JVM调用,JVM 便自动产生一个Class 对象。如果您想借由“修改Java标准库源码”来观察Class 对象的实际生成时机(例如在Class的constructor内添加一个println()),这样是行不通的!因为Class并没有public constructor。
Class是Reflection故事起源。针对任何您想探勘的类,唯有先为它产生一个Class 对象,接下来才能经由后者唤起为数十多个的Reflection APIs。这些APIs将在稍后的探险活动中一一亮相。
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 class片段。注意它的private Class() {},意指不允许任何人经由编程方式产生Class object。是的,其object 只能由JVM 产生

由于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;
		
	}




评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值