Java的反射机制
发表于|更新于
|总字数:284|阅读时长:1分钟|浏览量:
什么是反射机制
简单来说,反射机制就是程序在运行时能获取到自身的信息。在Java中,只要给定类的名字,那么就能通过反射机制来获得类的所有信息
Java反射机制的作用
- 在运行时判断任意一个对象所属的类
- 在运行时判断任意一个类所具有的成员变量和方法
- 在运行时任意调用一个对象的方法
- 在运行时构造任意一个类的对象
反射机制的优缺点
优点:
- 静态编译:在编译时即确定类型,绑定对象,即通过
- 动态编译:运行时确定类型,绑定对象。动态编译最大限度的发挥了Java的灵活性,体现了多态的应用,有利于降低类之间的耦合性
缺点:
对性能有一定影响,使用反射基本上是一种解释操作,我们可以告诉JVM,我们希望做什么并且它满足我们的要求。这类操作总是慢于直接执行相同的操作。
文章作者: 丨小小丶
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 Hexo!
相关推荐
2021-03-26
Java-final关键字
final作为Java中的关键字,可以用于修饰类、方法、参数和变量 final修饰类当用final修饰一个类时,标明这个类不能被继承。也就是说,如果一个类不需要有子类,类的细节不允许改变,并且确信这个类不会再被扩展,那么就可以使用final进行修饰 注意:被final修饰的类,类中的成员变量可以根据自己的实际需要设计为final。 final类中的成员方法都会被隐式的指定为final方法。 final修饰方法如果一个类不允许其子类覆盖某个方法,则可以把这个方法声明为final方法。可以将方法锁定,防止任何继承类修改它的意义和实现。 final修饰变量用final修饰的变量表示常量,只能被赋值一次,赋值后无法改变。 当final修饰一个基本数据类型时,表示该基本数据类型的值一旦在初始化后便不能发生变化 如果final修饰一个引用类型时,则再起初始化之后便不能再让其只想其他对象了,但该引用所指向的对象的内容是可以发生变化的。因为引用的值是一个地址,final要求值,即地址的值不发生变化 final修饰一个成员变量(属性),必须要显式初始化。一共有两种初始化方式:一种是在变量声明的...
2021-04-26
死锁
什么是死锁? 所谓死锁,就是指多个进程在运行过程中因争夺资源而造成的一种僵局,当进程处于这种僵持状态时,若无外力作用,它们都将无法再向前推进。 死锁产生的4个必要条件 互斥:进程要求对所分配的资源进行排它性控制,即在一段时间内某资源仅为一进程所占用。 请求和保持:当进程因请求资源而阻塞时,对已获得的资源保持不放。 不剥夺:进程已获得的资源在未使用完之前,不能剥夺,只能在使用完时由自己释放。 换路等待:在发生死锁时,必定存在一个进程-资源的环形链 解决死锁的基本方法预防死锁 资源一次性分配:一次性分配所有资源,这样就不会再有请求了。 可剥夺资源:即某个进程获得了部分资源,但得不到其他资源的时候释放已有的资源 资源有序分配:系统给每类资源进赋予一个编号,每一个进程按编号递增的顺序请求资源,释放则相反 避免死锁 系统在进行资源分配之前预先计算资源分配的安全性,若此次分配不会导致系统进入不安全的状态,则将资源分配给进程;否则,进程等待。 检测死锁 首先为每个进程和每个资源指定一个唯一的号码,然后简历资源分配表和进程等待表 解除死锁 当发现有进程死锁...
2021-03-16
高频考点:ArrayList和LinkedList
ArrayList和LinkedList的主要区别 1.LinkedList和ArrayList的差别主要来源于其二者的数据结构不同。ArrayList是基于动态数组实现的,LinkedList是基于双链表实现的。另外LinkedList类可以根据索引来随机访问集合中的元素,还实现了Deque接口,Deque接口是Queue接口的子接口,代表了一个双向队列,因此LinkedList可以作为双向队列、栈和List集合使用 2.因为Array是基于索引的数据结构,它使用索引在数组中搜索和读取数据时很快的,可以直接返回数组中index位置的元素,因此在随机访问集合元素上有较好的性能。Array获取数据的时间复杂度是O(1),但是要插入、删除数据时开销会很大,因为需要移动数组中插入/删除位置之后的所有元素。 3.相对于ArrayList,LinkedList的随机访问集合元素时性能较差,因为需要在双向链表中找到index的位置再返回;但在进行插入、删除操作时比前者要快,因为LinkedList不像ArrayList,不需要改变数组的大小,也不需要在数组装满的时候要将所有的数据重新装入一...
2021-03-24
Java基础:接口和抽象类的区别
1、基本语法区别Java中接口和抽象类的定义语法分别为interface和abstract关键字 抽象类:在Java中被abstract关键字修饰的类称为抽象类,被abstract关键字修饰的方法称为抽象方法,抽象方法只有方法的声明,没有方法体。抽象类的特点有: 抽象类不能被实例化,只能被继承 包含抽象方法的一定是抽象类,但是抽象类不一定含有抽象方法 抽象类中的抽象方法的修饰符只能为public或者protected,默认为public 一个子类继承一个抽象类,则子类必须实现父类抽象方法,否则子类也必须定义为抽象类 抽象类可以包含属性、方法、构造方法,但是构造方法不能用于实例化,主要作用是被子类调用 接口:Java中接口使用interface关键字修饰,特点为: 接口可以包含变量、方法,变量被隐式指定为public static final,方法被隐式指定为public abstract 接口支持多继承,即一个接口可以extends多个接口,间接的解决了Java中类的单继承为题 一个类可以实现多个接口 JDK1.8中对接口增加了新的特性: 默认方法:JDK1.8允...
2021-03-19
类的初始化、加载和实例化的过程
一、一个类及对象初始化的过程 什么时候需要初始化一个类首次创建某个对象时 Dog dog = new Dog(); 或是首次访问某个类的静态方法或者是静态字段的时候 Dog.staticFields; 获得类的资源然后JVM就会载入Dog.class,生成一个class对象。这个时候如果有静态的方法或者变量,静态初始化的动作都会被执行。静态初始化在程序运行过程中只会在Class对象首次加载的时候运行一次,这些资源都会放在JVM的方法区。 方法区又叫静态区,和堆一样,被所有的线程共享。 方法区包含的都是在整个程序中永远唯一的元素,包含所有的class和static变量 初始化对象Dog dog = new Dog() 第一次创建Dog对象先执行上面的一二步 在堆上为Dog对象分配足够的存储空间,所有属性和方法都被设置成默认值(数字为0,字符为null,布尔为false,而所有引用被设置成null) 执行构造函数时检查是否有父类,如果有父类就会先调用父类的构造函数,这里假设Dog没有父类,执行默认值字段的赋值即方法的初始化动作 执行构造函数 有父类情况下的初始化假设Dog ...
2021-03-17
Java中的锁
1.锁的 7 大分类 偏向锁/轻量级锁/重量级锁 可重入锁/非可重入锁 共享锁/独占锁 公平锁/非公平锁 悲观锁/乐观锁 自旋锁/非自旋锁 可中断锁/不可中断锁 2.偏向锁/轻量级锁/重量级锁 偏向锁如果自始至终,对于这把锁都不存在竞争,那么其实就没必要上锁,只需要打个标记就行了,这就是偏向锁的思想。一个对象被初始化后,还没有任何线程来获取它的锁时,那么它就是可偏向的,当有第一个线程来访问它并尝试获取锁的时候,它就将这个线程记录下来,以后如果尝试获取锁的线程正是偏向锁的拥有者,就可以直接获得锁,开销很小,性能最好。 轻量级锁JVM 开发者发现在很多情况下,synchronized 中的代码是被多个线程交替执行的,而不是同时执行的,也就是说并不存在实际的竞争,或者是只有短时间的锁竞争,用 CAS 就可以解决,这种情况下,用完全互斥的重量级锁是没必要的。轻量级锁是指当锁原来是偏向锁的时候,被另一个线程访问,说明存在竞争,那么偏向锁就会升级为轻量级锁,线程会通过自旋的形式尝试获取锁,而不会陷入阻塞。 重量级锁重量级锁是互斥锁,它是利用操作系统的同步机制实现的,所以开销相对比较...
