java.lang包—类Class

原文作者:一人浅醉-

原文地址:Java中的Class类

目录

生成Class对象的三种方式

Class常用方法解释

总结


Class 类是在Java语言中定义一个特定类的实现。一个类的定义包含成员变量,成员方法,还有这个类实现的接口,以及这个类的父类。Class类的对象用于表示当前运行的 Java 应用程序中的类和接口。 比如:每个数组均属于一个 Class 类对象,所有具有相同元素类型和维数的数组共享一个Class 对象。基本的 Java 类型(boolean, byte, char, short,int, long, float 和 double) 和 void 类型也可表示为 Class 对象。以下示例使用 Class 对象显示一个对象的 Class 名:

void printClassName(Object obj) {
System.out.println("The class of " + obj + " is " + obj.getClass().getName()); }

我们都知道所有的java类都是继承了object这个类,在object这个类中有一个方法:getclass().这个方法是用来取得该类已经被实例化了的对象的该类的引用,这个引用指向的是Class类的对象(呵呵,有点别扭)。我们自己无法生成一个Class对象(构造函数为private),而这个Class类的对象是在当各类被调入时,由 Java 虚拟机自动创建 Class 对象,或通过类装载器中的 defineClass 方法生成。 我们生成的对象都会有个字段记录该对象所属类在CLass类的对象的所在位置。如下图所示:

我们可以把每个Class类的对象当做众多类的代理。而且在每个Class类对象中有会有字段记录他引用的这个类的类加载器。如果该字段为null,表示该类的加载器为bootstrap loader.具体原因见我之前分享过的一篇“《ClassLoader工作机制 》”一文。

我们知道java中有多个加载器,每个加载器能载入多个类,所以只要取得Class类对象,就可利用其getClassLoader()方法取得该类加载器的引用。jvm为每种类管理者独一的Class对象。因此我们可以用双等号操作符来比较对象:a1.getClass()==A.class;应该返回的是true。

生成Class对象的三种方式

  • 类名.Class:也称类字面常量,生成Class对象不会初始化的静态块,不会调用构造函数,不会初始化参数
  • Class.forName("全路径名"):生成Class对象会初始化类静态块,但不会初始化非静态的代码块,也不调用构造函数
  • 实例对象.getClass():生成Class对象会先初始化静态块,接着执行非静态块的初始化,最后调用构造函数

接着看三种方式生成Class对象的区别

package com.shangcg.reflect;
/*
 *  三种方式生成Class对象的区别测试
 *  说明:测试一、二、三可屏蔽代码分开进行看输出结果
 */
public class ClassDemo {
  public static void main(String[] args)
  {
    try {
      /*  
       *  测试一   测试类名.class  
       *  输出为:testTypeClass---class com.shangcg.reflect.AnyOneObject 说明没有执行构造函数没有执行静态块
       */
      Class<?> testTypeClass = AnyOneObject.class;
      System.out.println("testTypeClass---" + testTypeClass);
      /*测试二   测试Class.forName()   
       * 输出为:
       ---静态的参数初始化--- 说明执行静态块
       testForName---class com.shangcg.reflect.AnyOneObject 
       */
       Class<?> anyOneTypeForName = Class.forName("com.shangcg.reflect.AnyOneObject");
       System.out.println("testForName---" + anyOneTypeForName);
       /* 测试三   测试Object.getClass()
        * 输出:
        * ---静态的参数初始化---  执行静态块
          ----非静态的参数初始化--- 执行非静态块初始化
          ----构造函数--- 执行构造函数
          testGetClass---class com.shangcg.reflect.AnyOneObject
        */
      AnyOneObject testGetClass = new AnyOneObject();
      System.out.println("testGetClass---" + testGetClass.getClass());
    } catch (Exception e) {
      e.printStackTrace();
    }
  }
}

class AnyOneObject {
  //构造函数  
  public AnyOneObject() {
    System.out.println("----构造函数---");
  }
  //静态的参数初始化  
  static {
    System.out.println("---静态的参数初始化---");
  }
  //非静态的参数初始化  
  {
    System.out.println("----非静态的参数初始化---");
  }
}

Class常用方法解释

Class就是普通的一个类,和我们平时写的类没有什么区别,它位于java.lang包下,和java.lang.reflect包下的类共同支持了java的整个反射功能

 常用方法列表

getName()//返回String形式的该类的名称。
newInstance()//根据某个Class对象产生其对应类的实例,它调用的是此类的默认构造方法(没有默认无参构造器会报错)
getClassLoader()//返回该Class对象对应的类的类加载器。
getSuperClass()//返回某子类所对应的直接父类所对应的Class对象
isArray()//判定此Class对象所对应的是否是一个数组对象
getComponentType() //如果当前类表示一个数组,则返回表示该数组组件的 Class 对象,否则返回 null。 
getConstructor(Class[])//返回当前 Class 对象表示的类的指定的公有构造子对象。 
getConstructors() //返回当前 Class 对象表示的类的所有公有构造子对象数组。 
getDeclaredConstructor(Class[]) //返回当前 Class 对象表示的类的指定已说明的一个构造子对象。 
getDeclaredConstructors()//返回当前 Class 对象表示的类的所有已说明的构造子对象数组。 
getDeclaredField(String)//返回当前 Class 对象表示的类或接口的指定已说明的一个域对象。 
getDeclaredFields() //返回当前 Class 对象表示的类或接口的所有已说明的域对象数组。 
getDeclaredMethod(String, Class[])//返回当前 Class 对象表示的类或接口的指定已说明的一个方法对象。 
getDeclaredMethods() //返回 Class 对象表示的类或接口的所有已说明的方法数组。 
getField(String)//返回当前 Class 对象表示的类或接口的指定的公有成员域对象。 
getFields()//返回当前 Class 对象表示的类或接口的所有可访问的公有域对象数组。 
getInterfaces()//返回当前对象表示的类或接口实现的接口。 
getMethod(String, Class[]) //返回当前 Class 对象表示的类或接口的指定的公有成员方法对象。 
getMethods()//返回当前 Class 对象表示的类或接口的所有公有成员方法对象数组,包括已声明的和从父类继承的方法。 
isInstance(Object)//此方法是 Java 语言 instanceof 操作的动态等价方法。
isInterface() //判定指定的 Class 对象是否表示一个接口类型
isPrimitive()//判定指定的 Class 对象是否表示一个 Java 的基类型。
newInstance() //创建类的新实例

总结

以上就是本文关于浅谈Java中的class类的全部内容,希望对大家有所帮助。感兴趣的朋友可以继续参阅本站其他相关专题,如有不足之处,欢迎留言指出。感谢朋友们对本站的支持!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值