java深入理解反射机制

java类装载器

工作机制:

1:装载:查找和导入class文件
2:链接:执行校验(检查载入class文件的正确性),准备(给类静态变量分配存储空间)和解析(将符号引用变成直接引用)步骤
3:初始化:对类的静态变量、静态代码块执行初始化工作。

类装载工作主要是由类classLoder,及其子类来负责的。
classloder是一个java运行的主键
jvm在运行时会产生3个classloder
1:根装载器
2:扩展类装载器extclassloder
3:系统类装载器appclassloder

根装载器不是classloder的子类,是用c++编写的所以我们在java看不到它。
跟装载器用来负责装载jre的核心类库,如jre目标下的rt.jar等

extclassloder,appclassloder都是classloder的子类
extclassloder负责装载jre的括展目录exe中的jar类包
appclassloder负责装载classpath路径下的类包

这三个类装载器有父子关系
根装载器是appclassloder的父装载器是extclassloder的祖父装载器

从当前线程中获取classloder这个对象。

classLoder loader = Thread.currentTread().getContextClassLoader();
System.out.println("current loader:"+loader)当前appclassloader
System.out.println("parent loader:"+loader)当前extclassloader
System.out.println("grandparent loader:"+loader)当前装载器

因为在java中无法获得根装载器的句柄所以直接返回null
jvm装载类时使用全盘服从委托机制
全盘服从是指当一个classloder装载一个类的时候除非显示的使用另一个classloder该类则依赖基也用的类由这个classloder来载入。
而委托机制是指先委托父装载器寻找目标类只有在找不到的情况下才从自己的类路径中查找并装载目标类。
这个是从一个安全的角度来考虑的。让所有的装载器是由根装载器来装载的。避免装入一个不安全的类。

类装载器的重要方法。

1:class loadClass(String name)

name是装载类的名字,必须要使用全限量类名。不是所有的类都要解析。
2:class defineClass(String name,byte[] b,int off,int len)

将类文件的字节数组转换成java虚拟机中的java.lang.class对象,字节数组可以从本地文件系统远程网络来进行获取,而name为字节数组对应的全限定类名。
3:class findSystemClass(String name) 

从本地文件系统来载入class文件如果本地文件系统不存在该class文件那么将会抛出classnotfoundException这个异常,这个方法是jvm默认使用的机制
4:class findLoadedClass(String name)

调用该方法是来查看该classLoder是否已经装入到某个类当中,如果已经装入则返回java.lang.class对象,否则返回null值,如果强行装载已经存在的类,那么将会抛出链接错误
5:classLoder getParent()

获取该装载器的夫装载器,除根装载器之外,所有的类装载器有且只有一个父装载器。

class反射对象描述类语义结构,可以从Class对象中获取构造函数,成员变量,方法等类元素的反射对象,并以编程的方式通过这些反射对象对目标,对象进行操作这些反射对象类在java.reflect包中定义,下面是最主要的三个反射类。 

1:Constructor

Constructor 提供关于类的单个构造方法的信息以及对它的访问权限。

Constructor 允许在将实参与带有底层构造方法的形参的 newInstance() 匹配时进行扩展转换,但是如果发生收缩转换,则抛出IllegalArgumentException。

2:method

Method 提供关于类或接口上单独某个方法(以及如何访问该方法)的信息。所反映的方法可能是类方法或实例方法(包括抽象方法)。

Method 允许在匹配要调用的实参与底层方法的形参时进行扩展转换;但如果要进行收缩转换,则会抛出 IllegalArgumentException。
  1:class getRrturnType()
  2:class[] getParameterTypes()
  3: class[] getExceptionTypes()
  4: Annotaion [][] getParameterAnnotations():

3:File

Field 提供有关类或接口的单个字段的信息,以及对它的动态访问权限。反射的字段可能是一个类(静态)字段或实例字段。

Array 允许在执行 get 或 set 访问操作期间进行扩展转换,但如果将发生收缩转换,则抛出一个 IllegalArgumentException。

java反射机制 与ioc的关系

  在spring中,通过ioc可以将实现类、参数信息等配置在其对应的配置文件中,那么当需要更改实现类或参数信息时,只需要修改配置文件即可,
我们还可以对某对象所需要的其它对象进行注入,这种注入都是在配置文件中做的。

  Spring的ioc的实现原理利用的就是java的反射机制,Spring的工厂类会帮我们完成配置文件的读取、利用反射机制注入对象等工作,我们可以通过
bean的名称获取对应的对象。



深度学习是机器学习的一个子领域,它基于人工神经网络的研究,特别是利用多层次的神经网络来进行学习和模式识别。深度学习模型能够学习数据的高层次特征,这些特征对于图像和语音识别、自然语言处理、医学图像分析等应用至关重要。以下是深度学习的一些关键概念和组成部分: 1. **神经网络(Neural Networks)**:深度学习的基础是人工神经网络,它是由多个层组成的网络结构,包括输入层、隐藏层和输出层。每个层由多个神经元组成,神经元之间通过权重连接。 2. **前馈神经网络(Feedforward Neural Networks)**:这是最常见的神经网络类型,信息从输入层流向隐藏层,最终到达输出层。 3. **卷积神经网络(Convolutional Neural Networks, CNNs)**:这种网络特别适合处理具有网格结构的数据,如图像。它们使用卷积层来提取图像的特征。 4. **循环神经网络(Recurrent Neural Networks, RNNs)**:这种网络能够处理序列数据,如时间序列或自然语言,因为它们具有记忆功能,能够捕捉数据中的时间依赖性。 5. **长短期记忆网络(Long Short-Term Memory, LSTM)**:LSTM 是一种特殊的 RNN,它能够学习长期依赖关系,非常适合复杂的序列预测任务。 6. **生成对抗网络(Generative Adversarial Networks, GANs)**:由两个网络组成,一个生成器和一个判别器,它们相互竞争,生成器生成数据,判别器评估数据的真实性。 7. **深度学习框架**:如 TensorFlow、Keras、PyTorch 等,这些框架提供了构建、训练和部署深度学习模型的工具和库。 8. **激活函数(Activation Functions)**:如 ReLU、Sigmoid、Tanh 等,它们在神经网络中用于添加非线性,使得网络能够学习复杂的函数。 9. **损失函数(Loss Functions)**:用于评估模型的预测与真实值之间的差异,常见的损失函数包括均方误差(MSE)、交叉熵(Cross-Entropy)等。 10. **优化算法(Optimization Algorithms)**:如梯度下降(Gradient Descent)、随机梯度下降(SGD)、Adam 等,用于更新网络权重,以最小化损失函数。 11. **正则化(Regularization)**:技术如 Dropout、L1/L2 正则化等,用于防止模型过拟合。 12. **迁移学习(Transfer Learning)**:利用在一个任务上训练好的模型来提高另一个相关任务的性能。 深度学习在许多领域都取得了显著的成就,但它也面临着一些挑战,如对大量数据的依赖、模型的解释性差、计算资源消耗大等。研究人员正在不断探索新的方法来解决这些问题。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值