b04-2 spring容器相关java知识-反射(精通Spring 4.x)

本篇内容:
  • 1、java反射实现
  • 2、java类加载器ClassLoader
  • 3、java反射机制

一、java反射代码

1、创建java实体类

public class Car {
    private String brand;
    private String color;
    private int maxSpeed;
    public Car() {
    }
    public Car(String brand, String color, int maxSpeed) {
        this.brand = brand;
        this.color = color;
        this.maxSpeed = maxSpeed;
    }
    public void getData() {
        System.out.println("Car{" +
                "brand='" + brand + '\'' +
                ", color='" + color + '\'' +
                ", maxSpeed=" + maxSpeed +
                '}');
    }
    //    省略get,set方法
}

2、测试类:通过反射获取java对象

public class CarTest {
    public static Car initByDefaultConst() throws Exception {
        //得到ClassLoader对象
        ClassLoader loader = Thread.currentThread().getContextClassLoader();
        //通过java全路径名称获取java实体对象
        Class aClass = loader.loadClass("com.demo.Car");
        //获取反射对
        Constructor constructor = aClass.getDeclaredConstructor(null);
        //通过构造函数实例化java对象
        Car car = (Car) constructor.newInstance();
        //通过类对象获取实体的setter方法
        Method setBrand = aClass.getMethod("setBrand", String.class);
        setBrand.invoke(car, "雷克萨斯 ES");
        Method setColor = aClass.getMethod("setColor", String.class);
        setColor.invoke(car, "银色");
        Method setMaxSpeed = aClass.getMethod("setMaxSpeed", int.class);
        setMaxSpeed.invoke(car, 300);
        return car;
    }
    @Test
    public void getCar() throws Exception {
        Car car = initByDefaultConst();
        car.getData();
    }
}

二、java的类加载器ClassLoader

1、工作机制

  • 寻找类的字节码文件并构造出类在JVM内部表示对象的组件。
类加载器把一个类加入jvm的步骤
  • 1、装载:查找和导入Class文件
  • 2、连接:执行校验、准备和解析步骤(解析步骤是可选的)
  • 2.1、校验:检查载入Class文件数据的准确性
  • 2.2、准备:给类的静态变量分配存储空间
  • 2.3、解析:将符号引用转换成直接引用
  • 3、初始化:对类的静态变量,静态代码块执行初始化工作

  • 类的装载构造由ClassLoader及其子类负责,ClassLoader是一个重要的java运行时系统组件,负责在运行时查找和装入class字节码文件

  • JVM在运行时会产生3个ClassLoader:根装载器,ExtClassLoader(扩展类装载器),APPClassLoader(应用类装载器)

2、测试jvm中3个类的关系

    @Test
    public void getJVM(){
        ClassLoader loader = Thread.currentThread().getContextClassLoader();
        System.out.println("current: "+loader);
        System.out.println("current: "+loader.getParent());
        System.out.println("current: "+loader.getParent().getParent());
    }
  • 输出
current: sun.misc.Launcher$AppClassLoader@18b4aac2
current: sun.misc.Launcher$ExtClassLoader@776ec8df
current: null
  • 从输出内容可知:
  • 1、ClassLoader就是AppClassLoader,
  • 2、ClassLoader的父类是ExtClassLoader
jvm装载类时使用“全盘负责委托机制”。
  • 1、“全盘负责”:是指当一个ClassLoader装载一个类时,除非显示地使用另一个ClassLoader,该类所依赖及引用的类也由这个类载入。
  • 2、“委托机制”:是指先委托父类装载器找目标类,只有在找不到的情况下才从自己的类路径中查找并装载目标。

3、ClassLoader的重要方法

1、Class loadClass(String name)
  • name参数指定类装载需要的类名,必须使用全路径名称。重载方法Class loadClass(String name,boolean resolve)resolve参数告诉类装载器是否需要解析该类,在初始化前要考虑进行解析的工作,单不是所有的类都需要解析。
2、Class defuneClass(String name, byte[ ] b, int off, int len)
  • 将类文件的字节数组转换成JVM内部的Class对象,字节数组可以从本地文件系统,远程网络获取。参数name为全路径类名。
3、Class findSystemClass(String name)
  • 将本地文件系统载入Class文件,如果本地文件不存在该Class文件,将抛出ClassNotFoundException,该方法是JVM默认使用的装载机制
4、ClassLoader getParent()
  • 获取父类装载器,处理根装载器外所有的类装载器只有一个父装载器。ExtClassLoader的父装载器是根装载器,因为跟装载器不是java语言编写,无法获取
每个类在JVM中都拥有一个对应的Class对象,它提供了类结构信息的描述。Class对象是在装载类时由JVM通过调用类装载器中的defineClass()自动构造。

三、java反射机制

  • Class反射对象描述类语义结构,可以从Class对象中获取构造函数,成员变量,方法类等元素的反射对象,并以编程的方式通过这些反射对象对目标进行操作。
  • java主要反射类:Constructor,Method,Field

1、Constructor: 类的构造函数反射类

  • 通过Class#getConstructor()可以获取类的所有构造函数反射对象数组。
  • Constructor的一个主要方法是newInstance(Object[ ] initargs),通过此方法可以创建一个对象类的实例

2、Method:类方法的反射类

  • 通过Class#getDecrlaredMethods()可以获取类的所有方法反射类对象数组Method[ ]。
  • Method最主要的方法是incoke(Object obj,Object[ ] args),obj表示操作的目标对象,args为方法参数
Method用于获取类信息方法
  • Class getReturnType():获取方法的返回值类型
  • Class[ ] getParameterTypes():获取方法入参类型数组
  • Class[ ] getExceptionType():获取方法异常类型数组
  • Annotation[ ] [ ] getParameterAnnotations():获取方法的注解信息

3、Field:类的成员变量的反射类

  • 通过Class#getDeclaredFields()可以获取类的成员变量反射对象数组。
  • Class#getDeclaredField(String name):可以获取某个特定名称的成员变量反射对象
  • 主要方法:set(Object obj,Object value),obj表示操作的目标对象,value为设置值
  • 如果成员变量为基础类型,可以使用Fiel提供的带类型名的值设置方法:setBoolean(Object obj,boolean value),setInt(Object obj,int value)

4、私有方法反射

  • java为包提供了Package反射类,有注解反射类:AnnotatedElement反射类。
  • java的反射体系保证了可以通过程序化的方式访问目标类中所有的元素,对private或protected成员变量和方法,只要JVM安全机制允许也可以通过反射调用
4.1、定义实体类
public class PrivateCar {
    private String color;
    protected void getData() {
        System.out.println("the color is :" + color);
    }
}
4.2、测试类
public class PrivateCarTest {
    @Test
    public void getCar() throws Exception {
        ClassLoader loader = Thread.currentThread().getContextClassLoader();
        Class clazz = loader.loadClass("com.demo.PrivateCar");
        PrivateCar car = (PrivateCar) clazz.newInstance();
        Field colorField = clazz.getDeclaredField("color");
        colorField.setAccessible(true);     //取消java语言访问检查
        colorField.set(car,"银色");
        Method method = clazz.getDeclaredMethod("getData", null);
        method.setAccessible(true);     //取消java语言访问检查
        method.invoke(car,null);
    }
}
注意:
  • 访问private或protected修饰的对象或方法需要调用setAccessible(boolean access)取消java语言检查,否则抛出异常。
demo代码地址

https://github.com/brusion/brusion-code/tree/master/demo-java/03%20-%20demo%20-%20spring/spring-study-4x/01-ioc/01-ioc-java
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在现有省、市港口信息化系统进行有效整合基础上,借鉴新 一代的感知-传输-应用技术体系,实现对码头、船舶、货物、重 大危险源、危险货物装卸过程、航管航运等管理要素的全面感知、 有效传输和按需定制服务,为行政管理人员和相关单位及人员提 供高效的管理辅助,并为公众提供便捷、实时的水运信息服务。 建立信息整合、交换和共享机制,建立健全信息化管理支撑 体系,以及相关标准规范和安全保障体系;按照“绿色循环低碳” 交通的要求,搭建高效、弹性、高可扩展性的基于虚拟技术的信 息基础设施,支撑信息平台低成本运行,实现电子政务建设和服务模式的转变。 实现以感知港口、感知船舶、感知货物为手段,以港航智能 分析、科学决策、高效服务为目的和核心理念,构建“智慧港口”的发展体系。 结合“智慧港口”相关业务工作特点及信息化现状的实际情况,本项目具体建设目标为: 一张图(即GIS 地理信息服务平台) 在建设岸线、港口、港区、码头、泊位等港口主要基础资源图层上,建设GIS 地理信息服务平台,在此基础上依次接入和叠加规划建设、经营、安全、航管等相关业务应用专题数据,并叠 加动态数据,如 AIS/GPS/移动平台数据,逐步建成航运管理处 "一张图"。系统支持扩展框架,方便未来更多应用资源的逐步整合。 现场执法监管系统 基于港口(航管)执法基地建设规划,依托统一的执法区域 管理和数字化监控平台,通过加强对辖区内的监控,结合移动平 台,形成完整的多维路径和信息追踪,真正做到问题能发现、事态能控制、突发问题能解决。 运行监测和辅助决策系统 对区域港口与航运业务日常所需填报及监测的数据经过科 学归纳及分析,采用统一平台,消除重复的填报数据,进行企业 输入和自动录入,并进行系统智能判断,避免填入错误的数据, 输入的数据经过智能组合,自动生成各业务部门所需的数据报 表,包括字段、格式,都可以根据需要进行定制,同时满足扩展 性需要,当有新的业务监测数据表需要产生时,系统将分析新的 需求,将所需字段融合进入日常监测和决策辅助平台的统一平台中,并生成新的所需业务数据监测及决策表。 综合指挥调度系统 建设以港航应急指挥中心为枢纽,以各级管理部门和经营港 口企业为节点,快速调度、信息共享的通信网络,满足应急处置中所需要的信息采集、指挥调度和过程监控等通信保障任务。 设计思路 根据项目的建设目标和“智慧港口”信息化平台的总体框架、 设计思路、建设内容及保障措施,围绕业务协同、信息共享,充 分考虑各航运(港政)管理处内部管理的需求,平台采用“全面 整合、重点补充、突出共享、逐步完善”策略,加强重点区域或 运输通道交通基础设施、运载装备、运行环境的监测监控,完善 运行协调、应急处置通信手段,促进跨区域、跨部门信息共享和业务协同。 以“统筹协调、综合监管”为目标,以提供综合、动态、实 时、准确、实用的安全畅通和应急数据共享为核心,围绕“保畅通、抓安全、促应急"等实际需求来建设智慧港口信息化平台。 系统充分整合和利用航运管理处现有相关信息资源,以地理 信息技术、网络视频技术、互联网技术、移动通信技术、云计算 技术为支撑,结合航运管理处专网与行业数据交换平台,构建航 运管理处与各部门之间智慧、畅通、安全、高效、绿色低碳的智 慧港口信息化平台。 系统充分考虑航运管理处安全法规及安全职责今后的变化 与发展趋势,应用目前主流的、成熟的应用技术,内联外引,优势互补,使系统建设具备良好的开放性、扩展性、可维护性。
提供的源码资源涵盖了安卓应用、小程序、Python应用和Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值