1.反射的基础类: java.lang.Class
2.Class代表了一类事物,java类用于描述一类事物的共性,如该类事物有什么属性,没什么属性,至于这个属性的值是什么,则是由这个类的实例对象来确定的。java程序中的java类,属于同一类事物,描述这类事物的java类名就是Class。
3.Class的各实例对象分别对应各个类在内存中的字节码。java源程序被编译成一对二进制的class代码,当我们需要用到某个类是,首先把类的字节码加载到内存中,然后再用该字节码去复制一个个的实例对象。每份字节码都是Class的实例对象,即Class类的实例对象就代表内存中的字节码。
4.一个类被类加载器加载到内存中,占用一片存储空间,他这个空间里的内容就是这个类的字节码,不同类的字节码是不同的,所以他们咋内存中的内容就是不同的。这个样子的一个个空间分别用一个个的对象来表示,这些显然具有形同的类型,这个类型就是Class类型。
5.如何获得各类的字节码:有三种方式:
//类名.class 例如:
System.class
//写程序的时候就知道类的名称
//对象.getClass() 例如:
new Date().getClass()
//Class.forName() 例如:
Class.forName("java.util.Date");//类的字符串的完整名称
6.Class.forName()的作用:得到这个类的字节码,包含下面两种情况
.这个类的字节码已经加载到java虚拟机中,只需要找到返回.
.这个类的字节码在java虚拟机没找到,于是用类加载器加载,然后把类的字节码缓存起来再返回.
7.8个基本类型和一个void共9个预定义的Class实例对象
例如:
public static void main(String[] args) throws Exception {
System.out.println(int.class.isPrimitive());//true
System.out.println(int.class == Integer.class);//false
System.out.println(int.class == Integer.TYPE);//true,TYPE表示基本类型 Class实例。
System.out.println(void.class.isPrimitive());//true
System.out.println(int[].class.isArray());//true
}
个人觉得java的内省在调用getter和setter的时候更有优势,为什么再各种培训视频的时候都在讲实用拼写字符串的方式来获取字段的getter和setter方法呢?高手能不能解释下呢?