java中class_JAVA中的Class类
前言
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类相关推荐
- java interface class_Java中常量定义在interface和class的区别(转)
最终结论:定义常量在interface和class中其实都行,关键是看你的设计和个人爱好. Java中interface中定义变量默认都是"public static final" ...
- java中class_Java中Class对象详解
https://blog.csdn.net/mcryeasy/article/details/52344729 待优化整理 总结 Class类简介 在java世界里,一切皆对象.从某种意义上来说,ja ...
- java.io包对象读写_java.io 包中的____________和____________类主要用于对对象(Object)的读写_学小易找答案...
[多选题]连铸钢水成分控制的要求有( ). [单选题]起动机用直流电动机将电能转化为 [单选题]下列关于我国少数民族传统禁忌的说法中,错误的是( ). [多选题]下列选项中 , 属于表单控件的是 ( ...
- 在 Java Web 项目中,Service 层和 Dao 层真的有必要每个类都加上接口吗
作者 l 会点代码的大叔(CodeDaShu) 很多程序员在刚开始工作的时候,接触到的项目都是这样做的:项目的代码被分成 Controller.Service.Dao 层,一个接口对应一个实现类,然后 ...
- Throwable是java.lang包中一个专门用来处理异常的类
答:Throwable是java.lang包中一个专门用来处理异常的类.它有两个子类,即Error 和Exception,它们分别用来处理两组异常. Error用来处理程序运行环境方面的异常,比如,虚 ...
- Java中是否可以继承String类,为什么
详细解析: 1. 关于final修饰符 参考文章: 浅析Java中的final关键字 根据程序上下文环境,Java关键字final有"这是无法改变的"或者"终态的&qu ...
- java 为什么有匿名类_全面了解Java中的内部类和匿名类
Java内部类(Inner Class),类似的概念在C++里也有,那就是嵌套类(Nested Class),乍看上去内部类似乎有些多余,它的用处对于初学者来说可能并不是那么显著,但是随着对它的深入了 ...
- java final 类_在Java中,final修饰的类有什么特点
展开全部 关于Java中的32313133353236313431303231363533e4b893e5b19e31333264663736final(2010-09-09 14:19:48)转载▼ ...
- Java中如何引用另一个类里的集合_【18期】Java序列化与反序列化三连问:是什么?为什么要?如何做?...
Java序列化与反序列化是什么? Java序列化是指把Java对象转换为字节序列的过程,而Java反序列化是指把字节序列恢复为Java对象的过程: 序列化:对象序列化的最主要的用处就是在传递和保存对象 ...
最新文章
- 关于Jvm知识看这一篇就够了
- java opengl_java基于OpenGL ES实现渲染实例
- jquery ajax 调用webservice以及跨域问题
- matlab版本下载地址
- OpenCV:鼠标画直线并显示坐标
- python图片转gif
- Elasticsearch 的 Task 停止方法
- KGB知识图谱完成金融行业的信息抽取工作
- 轴承特征频率计算公式
- 某型雷达的报文收发实录
- java编程基础学习需要多久的时间
- jzxx1033能被5整除且至少有一位数字是5的所有整数的个数
- A网站访问B网站,跨域问题
- .Net Framework OleDb 数据提供程序要求 Microsoft Data Access Components(MDAC) 2.6 或更高版本
- 如何画出一张合格的思维导图?
- charles如何抓取微信小程序
- 苹果也是纸老虎,其nano-sim标准真是另人精艳
- centos7安装ocaml
- Chrome访问https页面显示ERR_CERT_INVALID,且无法跳过继续访问 本地证书过期处理
- Ubuntu下使用Tobii Eye Tracker 4C眼动仪
热门文章
- 大数据文字游戏_基于大数据的游戏化教学系统研究.docx
- linux 终端 含义,ubuntu终端中@前后的字符串含义及修改-布布扣-bubuko.com
- opencv4 图像无缝融合
- YOLOv5发布第六个版本,支持一键适配OpenVINO/OpenCV DNN部署
- 中山大学提出SimAM:无参Attention!助力分类/检测/分割涨点!
- xface 远程桌面 无法使用tab键盘
- Gradle Sync: Wait for the other thread to finish acquiring the distribution
- opengl 预览摄像头
- wfs.js 多路视频 串屏 闪烁
- Can't get attribute '_rebuild_tensor_v2' on module 'torch._utils'