类加载器、反射

本文围绕Java展开,介绍了Class类,它封装类的信息,有三种获取Class对象的方式;阐述了类加载器,包括启动、扩展、系统类加载器等,有委托、可见、单一机制,还提及破坏双亲模型的方法;最后讲解反射,其能在运行时操作类信息,有优势也有缺点。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Class类

–对象照镜子后可以得到的信息:某个类的数据成员名、方法和构造器、某个类到底实现了哪些接口。对于每个类而言,JRE 都为其保留一个不变的 Class 类型的对象。一个 Class 对象包含了特定某个类的有关信息。
  –Class 对象只能由系统建立对象
  –一个类在 JVM 中只会有一个Class实例
  –每个类的实例都会记得自己是由哪个 Class 实例所生成.

Class是什么?

  Class是一个类:
public class ReflectionTest {
    @Test
    public void testClass() {
       Class clazz = null;
    }
}


//Class的定义
public final
    class Class<T> implements java.io.Serializable,
                              java.lang.reflect.GenericDeclaration,
                              java.lang.reflect.Type,
                              java.lang.reflect.AnnotatedElement {

.....
.....
.....
}
//小写class表示是一个类类型,大写Class表示这个类的名称

Class这个类封装了什么信息?

Class是一个类,封装了当前对象所对应的类的信息
一个类中有属性,方法,构造器等,比如说有一个Person类,一个Order类,一个Book类,这些都是不同的类,现在需要一个类,用来描述类,这就是Class,它应该有类名,属性,方法,构造器等。Class是用来描述类的类
Class类是一个对象照镜子的结果,对象可以看到自己有哪些属性,方法,构造器,实现了哪些接口等等
对于每个类而言,JRE 都为其保留一个不变的 Class 类型的对象。一个 Class 对象包含了特定某个类的有关信息。
Class 对象只能由系统建立对象,一个类(而不是一个对象)在 JVM 中只会有一个Class实例

获取Class对象的三种方式

1.通过类名获取 类名.class

2.通过对象获取 对象名.getClass()

3.通过全类名获取 Class.forName(全类名)

java类加载器

  1. 启动类加载器(Bootstrap ClassLoader)
  2. 扩展类加载器(Extension ClassLoader)
  3. 系统类加载器(Application ClassLoader)
  4. 自定义加载器
    ClassLoader作用:
      1. 将Class加载到JVM中
      2. 审查每个类由谁加载。
      3. 将Class字节码重新解析成JVM统一要求的数据格式。
自定义加载器
Application ClassLoader
Extension ClassLoader
Bootstrap ClassLoader

三个机制

  1. 委托性:双亲委派模型
  2. 可见性:子类加载器可以看见所有父类加载器的类,父类加载器看不到子类加载器加载的类
  3. 单一性:类只能被加载一次。

双亲委派类

每次收到类加载请求后,先将请求给父类加载器完成(从顶层Bootstrap ClassLoader开始),如果父类加载器无法完成加载,子类加载器尝试自己加载。
避免了同一个类被多次加载,从而引起混乱。不同类加载器加载的类是不同的类。
加载过程

破坏双亲模型

重写loadclass方法,先尝试由system类加载期价在,加载失败自己加载,不先给父类加载。

反射

Reflection(反射)是Java被视为动态语言的关键,反射机制允许程序在执行期借助于Reflection API取得任何类的內部信息,并能直接操作任意对象的内部属性及方法。

Java反射机制主要提供了以下功能:

  1. 在运行时构造任意一个类的对象
  2. 在运行时获取任意一个类所具有的成员变量和方法
  3. 在运行时调用任意一个对象的方法(属性)
  4. 生成动态代理

Class 是一个类; 一个描述类的类.
  封装了描述方法的 Method,
描述字段的 Filed,
描述构造器的 Constructor 等属性.

优势

可以动态创建对象和编译,体现出很大的灵活性。
程序编译后发布了,需要更新某些功能时,采用静态的话需要修改后重新编译。使用反射,不用卸载,可以在运行时动态的创建和编译。

缺点

  1. 对性能有影响,解释操作慢于执行操作。
  2. 不安全,破坏了类的封装。
    与Java反射相关的类如下:
类名用途
Class类代表类的实体,在运行的Java应用程序中表示类和接口
Field类代表类的成员变量(成员变量也称为类的属性)
Method类代表类的方法
Constructor类代表类的构造方法

有参构造方法

Class<XXX> obj = XXX.class;
Constructor<XXX> con = clazz.getConstructor(String.class,int.class);
XXX obj = con.newInstance("tianye",24);
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值