前言

Class类是一个看起来熟悉又看起来陌生的类,平时常常用到它,但却从来没有创建过它的实例对象,因为它的构造函数是私有的,只有虚拟机才能够创建它的对象,但是它绝对是一个核心类,以至于要学好java就必须要精通它,希望我的理解可以对你有所帮助。

timg.jpg

Class类是什么

(1)它是一个类,存在于java.lang包中,它的构造函数是私有的,由JVM(类加载器)创建Class对象,我们可以通过getClass()方法获取到Class对象。

/*

* 私有构造函数,使得只有jvm可以创建该类的对象,这个私有构造函数还可以防止通过默认构造函数创建类对象

*/

private Class(ClassLoader loader) {

// 初始化final变量ClassLoader

classLoader = loader;

}

(2)Class对象,通过它我们可以拿到创建的类的属性,方法等。

image.png

Class类的作用

(1)获取类中属性的类型

(2)获取类中属性的名称

(3)获取类的方法

(4)获取类的基类等等

(5)综合上述可以利用它完成反射

Class的主要方法

1.forName方法

输入需要加载的类的全路径名,得到类的Class对象

2.newInstance方法

public T newInstance()

throws InstantiationException, IllegalAccessException

{

if (System.getSecurityManager() != null) {

checkMemberAccess(Member.PUBLIC, Reflection.getCallerClass(), false);

}

// NOTE: 下面的编码可能不是严格符合当前的java内存模型

// 寻找构造器

if (cachedConstructor == null) {

if (this == Class.class) {

throw new IllegalAccessException(

"Can not call newInstance() on the Class for java.lang.Class"

);

}

try {

Class>[] empty = {};

//获取无参构造器,如果没有就抛出异常,说明这个方法只适用于有无参构造函数的类

final Constructor c = getConstructor0(empty, Member.DECLARED);

// 设置构造器允许访问

java.security.AccessController.doPrivileged(

new java.security.PrivilegedAction() {

public Void run() {

c.setAccessible(true);

return null;

}

});

cachedConstructor = c;

} catch (NoSuchMethodException e) {

throw (InstantiationException)

new InstantiationException(getName()).initCause(e);

}

}

Constructor tmpConstructor = cachedConstructor;

// 安全检查

int modifiers = tmpConstructor.getModifiers();

if (!Reflection.quickCheckMemberAccess(this, modifiers)) {

Class> caller = Reflection.getCallerClass();

if (newInstanceCallerCache != caller) {

Reflection.ensureMemberAccess(caller, this, null, modifiers);

newInstanceCallerCache = caller;

}

}

// 执行无参构造函数创建实例对象

try {

return tmpConstructor.newInstance((Object[])null);

} catch (InvocationTargetException e) {

Unsafe.getUnsafe().throwException(e.getTargetException());

// Not reached

return null;

}

}

3.isInstance(native方法)

用于判断入参是否为当前Class对象(子类)的实现类

public class TestInfo {

static {

System.out.println("我是谁");

}

public TestInfo(){

System.out.println("我是构造函数");

}

public String test="测试属性";

public static void main(String[] args) {

TestClass info=new TestClass();

//返回结果是true因为info是子类的对象

System.out.println(TestInfo.class.isInstance(info));

}

public static class TestClass extends TestInfo{

}

}

4.getName、getTypeName、getCanonicalName、getSimpleName

public static void main(String[] args) {

System.out.println(TestClass.class.getTypeName());

System.out.println(TestClass.class.getCanonicalName());

System.out.println(TestClass.class.getSimpleName());

System.out.println(TestClass.class.getName());

System.out.println("-------------------------------------------------------");

System.out.println(TestClass[].class.getTypeName());

System.out.println(TestClass[].class.getCanonicalName());

System.out.println(TestClass[].class.getSimpleName());

System.out.println(TestClass[].class.getName());

}

public static abstract class TestClass extends TestInfo implements Aware, Comparable {

public abstract void test();

}

输出结果

com.hikvision.test.abc.TestInfo$TestClass

com.hikvision.test.abc.TestInfo.TestClass

TestClass

com.hikvision.test.abc.TestInfo$TestClass

-------------------------------------------------------

com.hikvision.test.abc.TestInfo$TestClass[]

com.hikvision.test.abc.TestInfo.TestClass[]

TestClass[]

[Lcom.hikvision.test.abc.TestInfo$TestClass;

5.getClassLoader

获取当前类的类加载器

6.getTypeParameters

获取泛型类中的泛型参数数组。

7.getSuperclass和getGenericSuperclass

都是获取父类信息,但是后者会带上泛型参数

8.getInterfaces和getGenericInterfaces

获取当前Class对象实现的接口数组,但是后者会带上接口的泛型参数,如

public static void main(String[] args) {

System.out.println(TestClass.class.getInterfaces()[1]);

}

public static abstract class TestClass extends TestInfo implements Aware,BeanFactory {

public abstract void test();

}

输出结果

interface org.springframework.beans.factory.BeanFactory

java.lang.Comparable

9.isAssignableFrom(native方法)

这个方法比较反人类,括号里的入参表示的是当前Class对象的父类或者是同一个对象时才成立。

//这样返回的是false

System.out.println(TestClass.class.isAssignableFrom(TestInfo.class));

10.isInterface(native方法)

判断是否为接口

11.isArray(native方法)

是否为数组

12.isPrimitive(native方法)

用于判断这个Class对象是否为基本类型,如int,byte,char等

13.isAnnotation

判断这个Class对象是否为注解

14.getComponentType

如果当前Class对象是数组,获取数组中的元素类型

15.getModifiers

获取属性或方法前面的修饰词对应的枚举值

16.getDeclaringClass

获取方法或属性的归属类,或者获取当前Class对象继承于哪个类

17.getSimpleName

Class对象的类名

18.getClasses、getDeclaredClasses

(1)获取Class对象中public修饰的内部类

(2)获取Class对象中的内部类,继承成员是不包含在内的

19.getFields、getField、getDeclaredFields

(1)获取public修饰的属性域

(2)根据输入的属性名查找对应的属性域

(3)获取Class对象中的属性域

20.getMethods、getMethod、getDeclaredMethods

(1)获取public修饰的方法

(2)根据输入的方法名和入参类型,查找对应的方法

(3)获取Class对象中的方法

21.getConstructors、getConstructor、getDeclaredConstructors

(1)获取public修饰的构造函数

(2)根据输入的方法名和入参类型,查找对应的构造函数

(3)获取Class对象中的构造函数

最后

类里面还有很多名称类似的方法,可以根据上述说明推测出他们的功能,还有一些不常用的方法,这里就不列举了

java中class_JAVA中的Class类相关推荐

  1. java interface class_Java中常量定义在interface和class的区别(转)

    最终结论:定义常量在interface和class中其实都行,关键是看你的设计和个人爱好. Java中interface中定义变量默认都是"public static final" ...

  2. java中class_Java中Class对象详解

    https://blog.csdn.net/mcryeasy/article/details/52344729 待优化整理 总结 Class类简介 在java世界里,一切皆对象.从某种意义上来说,ja ...

  3. java.io包对象读写_java.io 包中的____________和____________类主要用于对对象(Object)的读写_学小易找答案...

    [多选题]连铸钢水成分控制的要求有( ). [单选题]起动机用直流电动机将电能转化为 [单选题]下列关于我国少数民族传统禁忌的说法中,错误的是( ). [多选题]下列选项中 , 属于表单控件的是 ( ...

  4. 在 Java Web 项目中,Service 层和 Dao 层真的有必要每个类都加上接口吗

    作者 l 会点代码的大叔(CodeDaShu) 很多程序员在刚开始工作的时候,接触到的项目都是这样做的:项目的代码被分成 Controller.Service.Dao 层,一个接口对应一个实现类,然后 ...

  5. Throwable是java.lang包中一个专门用来处理异常的类

    答:Throwable是java.lang包中一个专门用来处理异常的类.它有两个子类,即Error 和Exception,它们分别用来处理两组异常. Error用来处理程序运行环境方面的异常,比如,虚 ...

  6. Java中是否可以继承String类,为什么

    详细解析: 1. 关于final修饰符 参考文章:  浅析Java中的final关键字 根据程序上下文环境,Java关键字final有"这是无法改变的"或者"终态的&qu ...

  7. java 为什么有匿名类_全面了解Java中的内部类和匿名类

    Java内部类(Inner Class),类似的概念在C++里也有,那就是嵌套类(Nested Class),乍看上去内部类似乎有些多余,它的用处对于初学者来说可能并不是那么显著,但是随着对它的深入了 ...

  8. java final 类_在Java中,final修饰的类有什么特点

    展开全部 关于Java中的32313133353236313431303231363533e4b893e5b19e31333264663736final(2010-09-09 14:19:48)转载▼ ...

  9. Java中如何引用另一个类里的集合_【18期】Java序列化与反序列化三连问:是什么?为什么要?如何做?...

    Java序列化与反序列化是什么? Java序列化是指把Java对象转换为字节序列的过程,而Java反序列化是指把字节序列恢复为Java对象的过程: 序列化:对象序列化的最主要的用处就是在传递和保存对象 ...

最新文章

  1. 关于Jvm知识看这一篇就够了
  2. java opengl_java基于OpenGL ES实现渲染实例
  3. jquery ajax 调用webservice以及跨域问题
  4. matlab版本下载地址
  5. OpenCV:鼠标画直线并显示坐标
  6. python图片转gif
  7. Elasticsearch 的 Task 停止方法
  8. KGB知识图谱完成金融行业的信息抽取工作
  9. 轴承特征频率计算公式
  10. 某型雷达的报文收发实录
  11. java编程基础学习需要多久的时间
  12. jzxx1033能被5整除且至少有一位数字是5的所有整数的个数
  13. A网站访问B网站,跨域问题
  14. .Net Framework OleDb 数据提供程序要求 Microsoft Data Access Components(MDAC) 2.6 或更高版本
  15. 如何画出一张合格的思维导图?
  16. charles如何抓取微信小程序
  17. 苹果也是纸老虎,其nano-sim标准真是另人精艳
  18. centos7安装ocaml
  19. Chrome访问https页面显示ERR_CERT_INVALID,且无法跳过继续访问 本地证书过期处理
  20. Ubuntu下使用Tobii Eye Tracker 4C眼动仪

热门文章

  1. 大数据文字游戏_基于大数据的游戏化教学系统研究.docx
  2. linux 终端 含义,ubuntu终端中@前后的字符串含义及修改-布布扣-bubuko.com
  3. opencv4 图像无缝融合
  4. YOLOv5发布第六个版本,支持一键适配OpenVINO/OpenCV DNN部署
  5. 中山大学提出SimAM:无参Attention!助力分类/检测/分割涨点!
  6. xface 远程桌面 无法使用tab键盘
  7. Gradle Sync: Wait for the other thread to finish acquiring the distribution
  8. opengl 预览摄像头
  9. wfs.js 多路视频 串屏 闪烁
  10. Can't get attribute '_rebuild_tensor_v2' on module 'torch._utils'