学习java 第十天

本文深入探讨了Java反射机制,包括其优点和缺点。详细阐述了Class类的获取方式,类加载的内存分析过程,如加载、链接(验证、准备、解析)、初始化。同时介绍了类加载器的作用,如引导类加载器、扩展类加载器和系统类加载器。此外,还讲解了如何动态创建对象,包括newInstance()方法和通过构造器创建对象,并展示了如何调用指定方法。最后提到了权限检查和private方法的访问。

反射机制(Reflection)

Reflection(反射)是Java被视为动态语言的关键

优点:可以实现动态创建对象和编译,具有很大的灵活性

缺点:对性能有影响。

Class类常用方法

 

获取Class类的实例

  • 对象.getClass

  • Class.forName(“全路径”)

  • 类名.class

类加载内存分析

  • 加载:将Class文件字节码内容加载到内存中,并将这些静态数据装换成方法区的运行时数据结构,然后生成一个代表这个类的java.lang.Class对象

  • 链接:将Java类的二进制代码合并到jvm的运行状态之中的过程

    • 验证:确保加载的类信息符合jvm规范,没有安全方面问题

    • 准备:正式为类变量(static)分配内存并设置类变量默认初始值的阶段,这些内存都将在方法区中进行分配。

    • 解析:虚拟机常量池内的符号引用(常量名)替换为直接引用(地址)的过程

  • 初始化(只有new一个对象和反射调用时才会初始化)

    • 执行类构造器<clinit>()方法的过程。类构造器<clinit>()方法是由编译期自动收集类中所有类变量的复制动作和静态代码块汇总的语句合并产生的。(类构造器是构造类信息的,不是构造该类对象的构造器)。

    • 当初始化一个类的时候,如果发现其父类还没有进行初始化,则需要先触发其父类的初始化。

    • 虚拟机会保证一个类的<clinit>()方法在多线程环境中被正确加锁和同步

类加载器(Classloader)

引导类加载器(Bootstap Classloader):用C++编写。负责Java平台核心库,无法直接获取

扩展类加载器(Extension Classloader):负责加载jre/lib/ext目录下的jar包

系统类加载器(System(App) Classloader):负责加载指定项目中的jar包

动态创建对象

CLass c1 = Class.forName(“全路径“)//获得class对象

  • 创建类的对象:调用Class对象的newInstance()方法 ----本质是调用了类的无参构造器

    • 类必须有一个无参数的构造器

    • 类的构造器的访问权限需要足够

  • 通过构造器创建对象

    • c1.getDeclaredConstructor() //获得构造器

    • 构造器名.newInstance()方法 //创建对象

  • 调用指定方法

    • 通过Class类的getMethod()方法取得一个Method对象

    • 使用Object invoke()进行调用,并向方法中传递要设置的obj对象的参数信息

    若原方法声明private,则需要在调用invoke()方法前,调用setAccessible(true)---->权限检测(默认为false),便可访问private的方法或参数

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值