java基础-反射

反射(reflection)机制

Properties可以读写配置文件

基本概念

1.什么是反射机制

2.反射机制原理图

反射流程

1.加载类,返回Class类型的对象cls

Class cls =Class.forname(classfullpath)

2.通过cls得到对应的类(被反射的)的对象实例

Cat o=cls.newINstance()

3.通过cls得到对应的类(被反射的)的实例的方法对象(在反射中,可以把方法视为对象)

Method method1 = cls.getMethod(methodName)

4.通过方法对象来实现方法调用

method1.invoke(o) //方法.invoke(对象)

反射相关的主要类

获取属性
获取构造器

//无参

Constructor constructor = cls.getConstructor();

//有参

Constructor constructor = cls.getConstructor(String.class);

反射的优缺

缺点优化方法:禁用访问安全检查的开关

Class类

class类的常用方法
获取class类对象的六种方法

1.读取全类名路径,加载类 Class.forName("全类名")

2.多用于参数传递,比如通过反射得到对应构造器对象 类名.Class

3.调用实例获取Class对象 实例.getClass()

4.通过类加载器来获取到类的Class对象

先得到类加载器,再通过类加载器得到Class对象

ClassLoader classLoader =car.getClass().getClassLoader();

class cls = classloader.loadClass(全类名)

类加载

类加载的时机
类加载的过程







java如何保证每个类只被初始化一次
双亲委派模型: Java的类加载器采用双亲委派模型。当一个类加载器试图加载某个类时,它首先会委托给其父类加载器去尝试加载这个类,这样一来,最终所有的加载请求都会传递到顶层的启动类加载器。这种方式确保了没有一个类会被加载两次。
synchronized的工作原理:
互斥锁: 当一个线程访问某个对象的一个synchronized同步代码块或同步方法时,它会自动获得该对象的锁。此时,其他任何线程都无法获取到这个锁。只有当持有锁的线程退出同步代码块或方法时,锁才会被释放,然后其他线程才能获取到锁并进入代码块或方法。

内存可见性: synchronized不仅保证互斥性,还保证了锁释放时前一个线程对共享变量的修改对于随后获得同一锁的其他线程是可见的,这是通过内存屏障来实现的。
类的初始化过程中的synchronized应用:

初始化阶段是执行类构造器()方法的过程,这个方法是由编译器自动收集类中所有类变量的赋值动作和静态语句块(static{}块)中的语句合并产生的。

当初始化一个类或接口时,为了保证这个过程的线程安全性,JVM内部对()方法的执行加锁,确保多线程环境中只有一个线程能执行类的()方法,以下是该过程的一些关键点:
锁定: JVM在类的初始化阶段会使用特定的锁来确保类的()方法在多线程环境中被正确地加锁、同步。如果多个线程同时去初始化一个类,那么它们将会被阻塞,直到初始化过程完成。
一次性: 一旦类的初始化完成,即类的()方法执行完毕,任何线程都不需要再次锁定就可以自由使用该类。因为类加载器会确保每个类只会被初始化一次。

获取类结构信息






爆破 使用反射可以访问private构造器

为什么是静态方法的话,invoke的参数可以为空

静态方法是与类本身相关联的,而不是与类的任何特定实例相关联。因此,静态方法可以在没有任何对象实例的情况下调用,即它们可以通过类本身来调用,而不是通过类的实例。

相关推荐
AI你一生一世2 小时前
不止于时序存储:DolphinDB 如何成为 AI 时代的工业智能底座
java·人工智能·struts·时序数据库·工业智能·dolphindb·ai基础设施
布莱克6053 小时前
C/C++ 中变量的声明与定义:区别、联系与常见误区
c语言·开发语言·c++·声明·定义
云-缩影3 小时前
拆解 AI 图像生成应用的后端架构:ECS、OSS 和大模型 API 怎么配合
java·spring boot·后端
LabVIEW开发3 小时前
LabVIEW 局部变量为何引发竞争条件?四种同步机制
开发语言·labview
瑞克-桑切斯3 小时前
7、MySQL 慢查询排查与优化实战指南
java·服务器·数据库
benchmark_cc3 小时前
A 股、港股、美股如何建立统一的标的主数据格式?
开发语言·python·数据分析·pandas·量化交易·股票数据·quantdash
Zenova EdgeOS5 小时前
Go 工业边缘错误处理实战:用 errors 构建可追溯错误链
开发语言·数据库·golang
取名真是5 小时前
Python 算法知识点从基础到进阶
开发语言·python·算法
FRing035 小时前
vue2干货总结3(computed计算属性、watch监听器)
开发语言·前端·vue.js·vue2
Fatbobman(东坡肘子)6 小时前
快速消失的硬盘容量 -- 肘子的 Swift 周报 #160
开发语言·人工智能·redis·ios·swiftui·iphone·swift