不是 JDK1.5的新特性 从1.2开始就有 ,在一些框架中 都会用到反射技术 ,这个技术用到的类就是 Class .
我们平时定义类用class ,但是我们这个Class是一个类 ,他代表一类事物 。
那这个Class类到底代表什么事物呢?
我们知道我们定义了一个对象比如 :
String str=new String() ;
那么这个str就是一个类的对象实例,并且对象有有一些信息来描述 这个对象的特性 比如他的内容啊 内容的程度啊 等等 。
这个Class其实也是在描述事物,只是他描述的不是对象的属性,而是Java所有类的属性 等等 、
每一个Java类都对应一个Class对象 ,描述这个类 有几个方法 几个属性 类的名字 等等
可以说Class类就是为了描述Java语言中的所有类的 。
如何获得Class对象呢 ?
比如我们有一个Person类 ,定义Person类的2个对象
Person p1=new Person() ;
Person p2=new Person() ;
那么我们如何获得Class对象呢 ?
Class c1=new Class() ;//这个是错误的因为Class压根就没提供构造方法 或者构造方法是私有的 我们不可能通过构造来产生对象
Class c2=字节码
字节码文件的作用?
字节码文件是 Java源文件编译之后的二进制文件
当我们使用一个类的时候,那么 JVM 会将类的字节码(也就是二进制文件)加载到内存中 , 然后通过这个字节码 在内存冲产生一个一个的对象 ,这才是对象创建的原理
.............................................................................................................................................
如果我用到 String Math Exception这三个类 ,那么内存中 就有三份字节码,那么这三份字节码其实就是三个 Class的对象 。
Class c1=Math.class ;//一旦我们用到这个类 那么内存中就会出现类的字节码 字节码就是一个对象 对象的类型就是Class
Class c2=object.getClass() ;//返回这个对象的类型的 Class对象 其实就是内存中的字节码 这个是从Object继承来的方法
Class.forName(String classname) ;//这个方法的作用?一道面试题
1、是Class类的静态方法 用于在JVM中加载一个指定名字的类,如果这个类没被加载那么JVM类加载器会加载类字节码 ,并返回字节码对象 也就是Class对象加载后的字节码会缓存。
2、第二如果 这个类已经被加载过了 ,那么他会保存在JVM的缓存中 ,那么下次我们调用的时候就不需要再次加载了 我们只需要从缓存中取出 Class对象即可 ,节省内存
反射的时候 主要使用这个 ,可以动态的产生 Class对象
8个基本类型对应8个Class对象 +void 其实有9个Class对象 Class c1=void.class;//这个也正确 因为void也有Class对象
Java反射的应用: Java中的各种类型均有定义的Class实例对象。 包括 原始类型 引用类型 自定义类型 void类型
package me.Test;
public class ReflectTest
{
public static void main(String[]args)
{
String str="abc" ;
Class c1=str.getClass() ; //通过对象的getClass方法返回
Class c2=String.class ; //通过String的class属性
Class c3 =null;
try
{
c3=Class.forName("java.lang.String") ; //通过类名字加载
}
catch(Exception e)
{
e.printStackTrace() ;
}
System.out.println(c1==c2) ;
System.out.println(c2==c3);
System.out.println(c1==c3);
System.out.println(c1.isPrimitive()); //不是原始类型
System.out.println(c2.isPrimitive()); //原始数据类型就是基本数据类型
System.out.println(c3.isPrimitive());//类不是原始数据类型
System.out.println(int.class.isPrimitive());//是原始类型
System.out.println(int.class==Integer.class); //不是原始类型
System.out.println(int.class==Integer.TYPE); //封装类型的TYPE就表示那个包装的原始数据类型的字节码
System.out.println(int[].class.isPrimitive());//数组不是原始类型 在Java中所有类型都有Class对象
}
}