我们平时创建的java类在编译之后就会形成一段二进制码,存到内存中。而每一个二进制码就是Class类的实例化对象,那么可想而知这个Class类就应当就如下一些方法:得到java类所在的包、得到类的名字、得到类中的方法。。。。。。
那么在实际的原程序中怎样才能得到各个字节码对应的实例对象呢,下面我们来看一下:
(1).类名.class,例如int.class;
(2).对象.getClass(),例如new Date().getClass();
(3).Class.forName("类名"),例如Class.forName("java.util.Date");
package com.www.ReflectClass;
/*
* 演示Java类获取自身字节码(就是一个Class实例化对象)的方式
*/
public class ReflectClassTest {
public static void main(String[] args) throws Exception {
// TODO Auto-generated method stub
String str = "abc"; //这是一个String类
Class cla1 = str.getClass(); //通过Java类所产生的对象获取
Class cla2 = String.class; //通过类名获取
Class cla3 = Class.forName("java.lang.String"); //通过Class类中的静态方法获取
System.out.println(cla1 == cla2);
System.out.println(cla1 == cla3);
//打印结果都为true,可见当一个类被创建后系统会首先在内存中找对应的字节码,
//要是已经有的话就直接加载,没有的话才会创建一个,之后便直接引用该字节码。
}
}
总结:我们平时写的Java类都是Class类的一个实例化对象,即为一段字节码。而在java中已经含有9个实例化对象,即在内存中已经存在着9个java类的字节码,我们可以直接引用。那就是八大基本数据类型(int、float、double、shot、long、char、boolean、byte)和void类。只要在源程序中出现的类型,都有各自的Class实例化对象,例如int[]、String、void......
一个Java类中有很多成分:成员变量、方法、修饰符等等,而反射就是将Java类中的各个成分映射为相应的java类。