反射的基础——Class类
Java的反射机制是从jdk1.2开始
要学习反射首先就要学习反射的基石—java的Class类
Class类代表java中的“类”。Java中的“类”是用来描述一类事物,比如:Person ,String,Intege….,这个“类”也是一种事物,就用Class代表
通过Class这个类我们可以了解,java中的个各类的方方面面的信息。比如:getName()能得一个类的名称,getMethods()能得到这个类中的所有方法列表等等。这和普通的类是一样的。
比如:
我们构建了一个Person类,创建了一个Person对象Person person = new Person();
还构建了一个Animal类,创建一个Animal对象 Animal animal = new Animal();
源代码经过编译以后变成二进制的字节码被加载到内存,当程序中用到这两个Java类,在内存就会有两份字节码,每一分字节码就是一个Class对象。所以一个Class对象就是代表在内存中的一份字节码。
通过什么方式搞到Class对象呢?Class classTest = new Class();吗?不是的,
因为一个Class对象就是代表在内存中的一份字节码,Class classTest = 字节码也就是
Class classTest =类名.class。
获得一个类的字节码还可以这样表示 Class classTest = person.getClass();以上两种情况获得字节码是在内存中已经加载的。还有一种情况可以在内存中不存在的情况下加载字节码,Class.forName(“一个类的完整的名字”);比如Class.forName(“java.lang.String”);得到的就是String类的字节码,还存在虚拟机中。
forName();就是Class的静态方法。其作用就是加载字节码,会抛出异常ClassNotFoundException。
public class Test {
public static void main(String[] args) throws ClassNotFoundException {
Person person = new Person();
Class classTest1 = Person.class;
System.out.println(classTest1);
System.out.println(person.getClass());
System.out.println(Class.forName("java.lang.String"));
System.out.println(classTest1 == person.getClass());
System.out.println(classTest1 == Class.forName("test.Person"));
System.out.println(person.getClass()==Class.forName("test.Person"));
//要实例化对象的字节码如果缓存中存在,则不在加载,因此以上它们加载的是同一个字节码对象,所以全部打印出true
}
九个预定义的Class实例对象—八个基本数据类型(boolean,byte,char,short,int,long,float,double)和void
publicclass Test {
publicstaticvoid main(String[] args) {
System.out.println(boolean.class);
System.out.println(byte.class);
System.out.println(char.class);
System.out.println(short.class);
System.out.println(int.class);
System.out.println(long.class);
System.out.println(float.class);
System.out.println(double.class);
System.out.println(void.class);
}
}
总之:在java中出现的各种数据类型都有各自的Class实例对象