Class类探索(一)

来源:互联网 发布:网络小鲜肉图片大全 编辑:程序博客网 时间:2024/06/05 20:27
  • Class类是干嘛的
    Class类封装了对象和接口运行时的状态,JVM依靠Class类来正确运行,Class类在类装载时就是内存中创建了Class类对象,八种基本数据类型(boolean,byte,char,short,int ,long ,float,double)和void 关键字都对应着一个Class类对象(包装类:Boolean,Byte,Character,Short,Integet,Long,Float,Double以及Void包装类)。每个相同类型和维数的数组共享一个Class类。

  • Class类的三种获取方式

public class StudyClass {    private static Class<?> bClass;    public static void main(String[] args) {        Person person = new Person();        System.out.println("获取Person对象:" + person.toString());        Class<? extends Person> aClass = person.getClass();        System.out.println("第一种方式获取 Class 对象:" + aClass.toString());        //-----------------------------------------------        try {            bClass = Class.forName("studyClass.Person");            System.out.println("第二种方式获取 Class 对象:" + bClass.toString());        } catch (ClassNotFoundException e) {            e.printStackTrace();        }        //---------------------------------------------        Class<Person> cClass = Person.class;        System.out.println("第三种方式获取 Class 对象:" + cClass.toString());        //那么我们可以来判断一下aClass bClass cClass 这三个Class对象在内存中的地址是否相等        if (aClass==bClass){            if (bClass == cClass){                System.out.println("相等");            }else {                System.out.println("不等");            }        }    }}

输出结果:

获取Person对象:Person{name='null', age=0}第一种方式获取 Class 对象:class studyClass.Person第二种方式获取 Class 对象:class studyClass.Person第三种方式获取 Class 对象:class studyClass.Person相等Process finished with exit code 0

由此我们可以看出,三种方式创建的Person类的Class对象的内存地址都是一样的, 通过上一篇文章我们知道了:类在转载的时候会进行类对象的内存地址的分配,也就是说我们的Person类只被转载了一次,且所有的Person对象共享该Class对象。

  • 常用方法
    1、静态方法.forName();
static Class<?> forName(String name, boolean initialize, ClassLoader loader)Returns the Class object associated with the class or interface with the given string name, using the given class loader.static Class<?> forName(String className)Returns the Class object associated with the class or interface with the given string name.

第二个方法在默认情况下会执行第一个方法的Class.forName(name,true,默认的此类的类加载器);当然了,我们可以指定这个类是否初始化和指定类的类加载器
2、newInstance();
newInstance 和new关键字所达到的效果其实是一样,两者的主要差别在于:

  • newInstance使用类的加载机制,而new是通过这个关键字来创建实例

  • 从JVM的角度来看,newInstance创建实例是需要先决条件的,newInstance需要这个类已经初始化,而new关键字则不需要

  • newInstance是弱类型,效率低,只能调用无参构造方法,而new是强类型,效率高

3、getName();返回该Class类对象所表示的实例的名称
4、getClassLoader();返回该类的类加载器

0 0
原创粉丝点击