java程序中的各个java类属于同一类事物,描述这类事物的java类就是Class
对于这样的一个类,也有他自己的属性和方法,等等。
Java中使用字节码来将类的各种信息保存在硬盘上,当我们需要使用一个类的时候,就会加载对应类在硬盘上的字节码。
我们如何得到一个类的字节码?有3中方式:
假设:Person Person = new Person();
方式一:类.class 例如: Class clas1 = Person.class;
方式二:对象.getClass() 例如: Class clas2 = person.getClass();
方式三:Class.forName("className") 例如:Class clas3 = Class.forName("Person");
通过上面的三种方式得到了3份字节码,但是这3份字节码是相同的,也就是说
clas1==clas2==clas3
需要注意的是,Class类没有公开的构造器,所以我们不能直接new Class();
java中有9种预定义的Class类型,分别是:
8中基本数据类型(byte、short、int、lang、float、double、boolean、char)和void
这9种预定义的类型分别也有他们自己的字节码。
得到java类的字节码以后,我们能有什么用?
我们可以通过字节码实例化这个类的一个对象
clazz.newInstance();
我们可以得的这个类的一些信息,包括类的名字,包含的属性,方法,构造器等等。
clazz.getName();
clazz.getConstructors();
clazz.getFields();
clazz.getMethods();
我们还可以判断这个类是不是数组,是不是基本类型,是不是接口等等。
clazz.isPrimitive();
clazz.isArray();
clazz.isInterface();
静态加载和动态加载:
静态加载:编译时加载,在编译的时候,就需要将可能用到的类加载出来。比如通过new方法创建的类,都是静态加载。只要有一个需要被静态加载的类不能成功加载,那么就会编译不通过。
动态加载:运行时加载,在运行的时候,再加载可能用到的类,如果找不到加载不成功,抛出异常。比如通过类类型加载,使用反射技术加载类,这时编译时不会报异常,只有在运行时,可能抛出异常。比如Class.forName("MyClass"),只有在运行的时候,才会加载MyClass类。
getFields()和getDeclaredFields(),getMethods()和getDeclaredMethods()的区别?
没有declared的表示的是获得所有的public的域或方法,包括从父类继承下来的,而不包含public或者protected的。有declared的表示的是获得自己的说有的域或方法,包括私有的和受保护的,而不包含任何父类的。
Class的基本API
获得方法信息:
Method[] methods = clazz.getMethods();
for(Method method:methods){
method....
}
获得域信息:
Field[] fields = clazz.getDeclaredFields();
for(Field field:fields){
field....
}
获得构造器信息:
Constructor[] constructors = clazz.getConstructors();
for(Constructor constructor:constructors){
constructor....
}
集合的泛型:
List list1 = new ArrayList();
List<String> list2 = new ArrayList<String>();
Class class1 = list1.getClass();
Class class2 = list2.getClass();
class1==class2;//ture
表示集合的泛型只是在编译的时候起作用,在运行的时候是去泛型化的,也就是在运行的时候,泛型是不起作用的。所以集合的泛型只能在编译的时候起到防止错误输入的作用,防止往集合中放入的对象的类型错我。因此我们可以通过反射绕过集合编译时的泛型验错,想集合中加入不同类型的对象。
Method method = class2.getMethod("add",Object.class);
method.invoke(list2,123);//相当于调运list2.add(123)方法。
这个时候千万不要通过for循环遍历集合,会抛类转换异常。
通过上面的反射技术,就可以想带泛型的集合中插入任意类型的对象。
相关推荐
《华夏基石——选、育、用、留:人力资源管理体系的构建》这份文档,由孙波博士主讲,重点讲述了企业如何构建完善的人力资源管理体系,以适应不断变化的时代背景和市场环境,支持企业的可持续发展。 首先,企业人力...
现代项目管理的基石——WBS
CC++后端开发精进基石——数据结构与算法(红黑树、BB+树,Hash,BoomFilter,b_Server-Development-Basics
《JUC基石——Unsafe类详解》 在Java并发编程领域,`Unsafe`类扮演着一个特殊的角色,尽管它被标记为“不安全”,但却是Java并发库(JUC)中的重要基石,尤其在高并发场景下,如`ConcurrentHashMap`、`Atomic`系列...
数据库技术是信息时代的核心...总的来说,数据库技术作为信息时代的基石,其重要性不言而喻。从数据模型、数据库语言到存储技术,再到与云计算、大数据和AI的融合,数据库技术持续创新,不断推动着信息化社会的进步。
#资源达人分享计划#
2014 年,以太坊的联合创始人 Dr. Gavin Wood 发表《去中心化应用:Web3.0 是 什么样子》一文,首次系统阐述了 Web3.0 的概念。Gavin Wood 认为 Web3.0 将在包括 区块链技术等一系列技术推动下,使得互联网变得更加...
【构筑安全基石】数字经济时代的网络安全问题相比传统互联网时代更为复杂,不仅包括传统威胁,如黑客攻击,还包括数据隐私保护、供应链安全等新挑战。因此,需要不断强化网络安全基础设施,建立健全的法规政策,提高...
2.2自信是成功的基石——学生学习课件
《XX基石——企业文化落地与传播》是一份深入探讨企业文化建设和实施的重要资料,旨在帮助企业构建独特且有力的企业文化,促进企业内部的凝聚力和对外的形象展示。企业文化是企业的灵魂,它不仅影响着员工的工作态度...
在很多微服务化的文章中,很少会把持续集成放在第一篇,因为大多数的文章都会将如何拆的问题,例如拆的粒度,拆的时机,拆的方式。为什么需要拆呢?因为这是人类处理问题的本质方式:将一个大的复杂问题,变成很多个...
**3.2 面向对象的基石——类** 1. **从结构到类**:结构体是C++中预定义的数据类型,而类是结构体的扩展,增加了行为(成员函数)的概念,使数据结构更加完整。 2. **类的定义**:类使用`class`关键字定义,包含...
2. 面向对象的基石——类: - **从结构到类**:结构体是C++中的一种数据结构,用于组合不同类型的数据。然而,类比结构体更进一步,不仅包含数据(成员变量),还包含操作数据的方法(成员函数)。类的定义使用`...
安全——幸福的基石.docx
为适应智能化无人开采技术的应用要求,中煤科工集团北京天地玛珂电液控制系统有限公司秉承集团“1245”总体发展思路,践行“创新驱动、聚焦主业”两大战略,完全自主研发新一代智能型网络控制系统,经过3年沉淀积累...
团队建设——成功的基石.pptx
《学前儿童心理发展——婴幼儿的反射》 在探讨学前儿童心理发展的过程中,了解婴幼儿的...因此,对于学前儿童心理发展的研究,婴幼儿的反射不容忽视,它们不仅是生命初期的生存策略,也是后续学习和认知发展的基石。
Java 并发——基石篇 的 pdf 文档,原文章我发布在知乎上了: https://zhuanlan.zhihu.com/p/75532011 但是知乎的格式不太好看,另外有字数限制,我不得不将文档分为三个部分。 这里提供一份 pdf 格式的文档,格式...