java反射的一些思考与理解

1.为什么需要反射?
包括但不仅限于提供了另外一种创建对象,调用对象方法,得到或使用对象属性的方式。
2.如何进行反射这个动作?
不得不夸reflection这个术语取得精妙。
在生活中要想反射就得借助类似镜子这样的工具,而在java中,class类对象就是这样一面镜子,每一个class类的对象都分别储存每一个类的结构信息。当然,也会有一个class类对象储存着class这个类的结构信息。
所以,只要获取一个class对象,就可以进行反射。
2.1
获取class对象的方式

//1.
Class<?> cls = Class.forName(String allClassName);
//2.
Class<? extends Cat> aClass = cat.getClass();
//3.
ClassLoader classLoader = cat.getClass().getClassLoader();
//4.
Class<Cat> catClass = Cat.class;
//对于基本数据类型和包装类还有以下两种
 Class<Integer> integerClass = int.class;
 Class<Integer> type = Integer.TYPE;

注意,上面提到的是获取一个class对象而不是生成或new一个class对象,class对象是无法new出来的。
而class对象在内存中只能存在一个,存放在堆里。往往在类加载的时候,通过类加载器调用ClassLoader的loadClass(String var1,boolean var2)方法就已经生成了,并且只会调用一次此方法。
类加载则有如下四种情况:
1.第一次new 一个类的对象实例
2.第一次访问静态成员
3.加载子类之前需要先加载父类
4.通过反射,Class.forName()进行加载。
前三种是静态加载,第四种是动态加载。
编译的时候要验证静态加载的类声明在源代码中是否存在,若不存在,无法编译通过生成.class文件。动态加载的类在编译时无需验证,只有运行到动态加载的类相关的代码时,若此类声明不存在,才会报错。
对于前面三种类加载情况,虽然有class类对象生成,但是我们没有此对象引用(即对象名的),所以需要通过上面的对象获取方式去获取那个已经生成的class类对象,并让一个对象引用指向它。

你可能感兴趣的:(GXM的Java学习日志,java,jvm,开发语言)