JAVA-2.反射-Class类

1.基本介绍

  1. Class也是类,因此也继承Object类;
  2. Classl类对象不是new出来的,而是系统创建的;
  3. 对应某个类的Class类对象,在内存中只有一份,因此类只加载一次;
  4. 每个类的实例都会记得自己是由哪个Class实例所生成;
  5. 通过Class对象可以完整地得到一个类的完整结构,通过一系列API;
  6. Class对象是存放在堆的;
  7. 类的字节码二进制数据,是放在方法区的,有的地方称为类的元数据(包括方法代码,变量名,方法名,访问权限等等)。
    在这里插入图片描述

2.获取Class类对象

  1. 前提:已知一个类的全类名,且该类在类路径下,可通过Class类的静态方法forName()获取,可能抛出ClassNotFoundExcetion。实例:Class cls1 = Class.forName(“java.lang.Cat”);
    应用场景:多用于配置文件,读取类全路径,加载类。

  2. 前提:若已经具体的类,通过类的Class获取,该方式最为安全可靠,程序性能最高。实例:Class cls2 = Cat.class;
    应用场景:多用于参数传递,比如通过反射得到对应构造器对象。

  3. 前提:已知某个类的实例,调用该实例的getClass()方法获取Class对象。实例:Class clazz = 对象.getClass();
    应用场景:通过创建好的对象,获取Class对象。

  4. 其他方式
    1)先得到类加载器;
    2)通过类加载器得到Class对象
    ClassLoader cl = 对象.getClass().getClassLoader();
    Class clazz4 = cl.loadClass(“类的全类名”);

  5. 基本数据类型按如下方式得到Class类对象;
    Class cls = 基本数据类型.class;

  6. 基本数据类型对应的包装类,可以通过==.TYPE==得到Class对象;
    Class cls = 包装类.TYPE

3.哪些类型有Class对象

  1. 外部类,成员内部类,静态内部类,局部内部类,匿名内部类;
  2. interface 接口;
  3. 数组;
  4. 枚举;
  5. annotation 注解;
  6. 基本数据类型;
  7. void。

4.类加载

1.基本说明

反射机制是java实现动态语言的关键,也就是通过反射实现类动态加载;

  1. 静态加载:编译时加载相关的类,如果没有则报错,依赖性太强;
  2. 动态加载:运行时加载需要的类,如果运行时不用该类,则不报错,降低了依赖性;

2.类加载时机

  1. 当创建对象时(new);//静态加载
  2. 当子类被加载时;//静态加载
  3. 调用类中的静态成员时;//静态加载
  4. 通过反射;//动态加载

3.类加载流程图

在这里插入图片描述
在这里插入图片描述

1.加载阶段

JVM在该阶段的主要目的是将字节码从不同的数据源(可能是class文件、也可能是jar包,甚至网络)转换为二进制字节流加载到内存中,并生成一个代表该类的java.lang.Class对象;

2.连接阶段-验证

  1. 目的是为了确保Class文件的字节流中包含的信息符合当前虚拟机的要求,并且不会危害虚拟机自身的安全;
  2. 包括:文件格式验证(是否以魔数oxcafebale开头)、元数据验证、字节码验证和符号引用验证;
  3. 可以考虑使用 -Xverify:none 参数来关闭大部分的类验证措施,缩短虚拟机类加载的时间。

3.连接阶段-准备

  1. JVM会在该阶段对静态变量、分配内存并进行默认初始化(对应数据类型的默认初始值,如 0、0L、null、false等)。这些变量所使用的内存都将在方法区中进行分配。
    在这里插入图片描述

4.连接阶段-解析

  1. 虚拟机将常量池内的符号引用替换为直接引用的过程;

5.Initialization(初始化)

  1. 到初始化阶段,才真正开始执行类中定义的JAVA程序代码,此阶段是执行clinit() 方法的过程;
  2. clinit() 方法是有编译器按语句在源文件中出现的顺序,依次自动收集类中的所有静态变量的赋值动作和静态代码块中的语句,并进行合并。
  3. 虚拟机会保证一个类的clinit()方法在多线程环境中被正确地加锁、同步,如果多个线程同时去初始化一个类,那么只会有一个线程去执行这个类的clinit()方法,其他线程都需要阻塞等待,直到活动线程执行clinit()方法完毕。

4.通过反射获取类的结构信息

1.第一组:java.lang.Class类

  1. getName 获取全类名
  2. getSimpleName 获取简单类名
  3. getFields 获取所有public修饰的属性,包含本类以及父类的
  4. getDeclaredFields 获取本类中的所有属性
  5. getMethods 获取所有public修饰的方法,包含本类以及父类的
  6. getDeclaredMethods 获取本类中所有方法
  7. getConstructors 获取本类所有public修饰的构造器
  8. getDeclaredConstructors 获取本类中所有构造器
  9. getPackage 以Package形式返回包信息
  10. getSuperClass 以Class形式返回父类信息
  11. getInterfaces 以Class[]形式返回接口信息
  12. getAnnotations 以Annotation[]形式返回注解信息

2.第二组:java.lang.reflect.Field类

  1. getModifiers 以int形式返回修饰符;
    【说明:默认修饰符是0,public是1,private是2,protected是4,static是8,final是16】(public(1)+static(8)=9)
  2. getType 以Class形式返回类型;
  3. getName 返回属性名

3.第三组:java.lang.reflect.Method类

  1. getModifiers 以int形式返回修饰符
    【说明:默认修饰符是0,public是1,private是2,protected是4,static是8,final是16】
  2. getReturnType 以Class形式获取返回类型
  3. getName 返回方法名
  4. getParameterTypes 以Class[]返回参数类型数组
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
系统根据B/S,即所谓的电脑浏览器/网络服务器方式,运用Java技术性,挑选MySQL作为后台系统。系统主要包含对客服聊天管理、字典表管理、公告信息管理、金融工具管理、金融工具收藏管理、金融工具银行卡管理、借款管理、理财产品管理、理财产品收藏管理、理财产品银行卡管理、理财银行卡信息管理、银行卡管理、存款管理、银行卡记录管理、取款管理、转账管理、用户管理、员工管理等功能模块。 文中重点介绍了银行管理的专业技术发展背景和发展状况,随后遵照软件传统式研发流程,最先挑选适用思维和语言软件开发平台,依据需求分析报告模块和设计数据库结构,再根据系统功能模块的设计制作系统功能模块图、流程表和E-R图。随后设计架构以及编写代码,并实现系统能模块。最终基本完成系统检测和功能测试。结果显示,该系统能够实现所需要的作用,工作状态没有明显缺陷。 系统登录功能是程序必不可少的功能,在登录页面必填的数据有两项,一项就是账号,另一项数据就是密码,当管理员正确填写并提交这二者数据之后,管理员就可以进入系统后台功能操作区。进入银行卡列表,管理员可以进行查看列表、模糊搜索以及相关维护等操作。用户进入系统可以查看公告和模糊搜索公告信息、也可以进行公告维护操作。理财产品管理页面,管理员可以进行查看列表、模糊搜索以及相关维护等操作。产品型管理页面,此页面提供给管理员的功能有:新增产品型,修改产品型,删除产品型。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值