学习反射

反射

一、Java的反射机制

JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。

二、关键点-获取Class文件对象

Properties p = new Properties();
        p.load(Test01.class.getClassLoader().getResourceAsStream("classPath.properties"));
        String path = p.getProperty("path");
        Class<?> clazz = Class.forName(path);
        
        //获取本类及其父类公有的方法对象
        Method[] methods = clazz.getMethods();
        for (Method method : methods) {
            System.out.println(method);
        }
        
        //获取本类所有的方法对象
        Method[] methods = clazz.getDeclaredMethods();
        for (Method method : methods) {
            System.out.println(method);
        }
        
        //获取本类及其父类的所有对象
        for(Class<?> c = clazz; c != null; c = c.getSuperclass()) {
            Method[] methods = c.getDeclaredMethods();
            for (Method method : methods) {
                System.out.println(method);
            }
        }
        
        //获取本类公有的指定名字的方法对象
        Method method = clazz.getMethod("setClassId",String.class);
        System.out.println(method);
        
        //利用反射工具类获取子类及其父类指定名字的方法对象
        Method method = ReflexUtil.getMethod(clazz, "method");
        System.out.println(method);
        
        //获取方法参数值
        int modifiers = method.getModifiers();
        System.out.println("是否使用public修饰:" + Modifier.isPublic(modifiers));
        System.out.println("是否使用static修饰:" + Modifier.isStatic(modifiers));
        System.out.println("是否使用final修饰:" + Modifier.isFinal(modifiers));
        System.out.println("是否使用private修饰:" + Modifier.isPrivate(modifiers));
        System.out.println("是否使用protected修饰:" + Modifier.isProtected(modifiers));
        System.out.println("是否使用abstract修饰:" + Modifier.isAbstract(modifiers));
        System.out.println("是否使用synchronized修饰:" + Modifier.isSynchronized(modifiers));
        
        
        
        
    }

三、利用反射操作方法

public static void main(String[] args) throws IOException, ClassNotFoundException, IllegalAccessException, IllegalArgumentException, InvocationTargetException {
        
        Properties p = new Properties();
        p.load(Test01.class.getClassLoader().getResourceAsStream("classPath.properties"));
        String path = p.getProperty("path");
        Class<?> clazz = Class.forName(path);
        
        //利用反射调用静态方法
        Method method = ReflexUtil.getMethod(clazz, "method");
        method.invoke(null);//静态方法不需要对象调用,就传入null
        
        Student stu = new Student();
        
        //利用反射调用成员方法 -- 无参数无返回值的方法
        Method method01 = ReflexUtil.getMethod(clazz, "method01");
        method01.invoke(stu);
        
        //利用反射调用成员方法 -- 带参数的方法
        Method method02 = ReflexUtil.getMethod(clazz, "method02", String.class,int.class);
        method02.invoke(stu, "好好学习,天天向上",100);
        
        //利用反射调用成员方法 -- 无参数带返回值的方法
        Method method03 = ReflexUtil.getMethod(clazz, "method03");
        String returnVal1 = (String) method03.invoke(stu);
        System.out.println(returnVal1);
        
        //利用反射调用成员方法 -- 带参数带返回值的方法
        Method method04 = ReflexUtil.getMethod(clazz, "method04", String.class,int.class);
        method04.setAccessible(true);//调用私有的成员方法是需要设置修改权限
        String returnVal2 = (String)method04.invoke(stu, "好好学习,天天向上",200);
        System.out.println(returnVal2);
        
        //利用反射工具类 -- 调用静态方法
        ReflexUtil.invoke(clazz, "method", null, null);
        
        Student stu = new Student();
        //利用反射工具类 -- 反射调用成员方法 -- 无参数无返回值的方法
        ReflexUtil.invoke(stu, "method01", null, null);
        
        //利用反射工具类 -- 反射调用成员方法 -- 带参数的方法
        ReflexUtil.invoke(stu, "method02", new Class[] {String.class,int.class}, new Object[] {"好好学习,天天向上",100});
        
        //利用反射工具类 -- 反射调用成员方法 -- 无参数带返回值的方法
        Object returnVal1 = ReflexUtil.invoke(stu, "method03", null, null);
        System.out.println(returnVal1);
        
        //利用反射工具类 -- 反射调用成员方法 -- 带参数带返回值的方法
        Object returnVal2 = ReflexUtil.invoke(stu, "method04", new Class[] {String.class,int.class}, new Object[] {"好好学习,天天向上",100});
        System.out.println(returnVal2);
        
    }

四、利用反射操作方法里的参数和返回值

public static void main(String[] args) throws IOException, ClassNotFoundException {
        
        Properties p = new Properties();
        p.load(Test03.class.getClassLoader().getResourceAsStream("classPath.properties"));
        String path = p.getProperty("path");
        Class<?> clazz = Class.forName(path);
        
        //利用反射工具类获取方法对象
        Method method = ReflexUtil.getMethod(clazz, "method04", String.class,int.class);
        
        //获取方法的参数个数
        int parameterCount = method.getParameterCount();
        System.out.println("获取方法的参数个数:" + parameterCount);
        System.out.println("------------------------------------");
        
        //获取方法参数的class对象数组
        Class<?>[] parameterTypes = method.getParameterTypes();
        for (Class<?> c : parameterTypes) {
            System.out.println(c);
        }
        System.out.println("------------------------------------");
        
        //获取方法参数的Type对象数组
        //一个参数类型就是一个Type对象
        Type[] genericParameterTypes = method.getGenericParameterTypes();
        for (Type type : genericParameterTypes) {
            System.out.println(type);
            System.out.println("------------------------------------");
        }
        
        //获取方法参数对象数组
        //一个参数就是一个参数对象
        Parameter[] parameters = method.getParameters();
        for (Parameter parameter : parameters) {
            System.out.println("获取方法的参数类型" + parameter.getType());
            
            /**
             * 注意:参数名不会随着编译而编译到class文件
             *      class文件描述该方法的参数名使用的是:arg0,arg1,arg2...
             */
            System.out.println("获取方法的参数名" + parameter.getName());
        }
        System.out.println("------------------------------------");
        
        //获取返回值的class对象
        Class<?> returnType = method.getReturnType();
        System.out.println("获取返回值的class对象:" + returnType);
        
        //获取返回值的Type对象
        Type genericReturnType = method.getGenericReturnType();
        System.out.println("获取返回值的type对象:" + genericReturnType);
        
        
    }
​
​

五、利用反射操作泛型

public static void main(String[] args) throws IOException, ClassNotFoundException {
        
        Properties p = new Properties();
        p.load(Test04.class.getClassLoader().getResourceAsStream("classPath.properties"));
        String path = p.getProperty("path");
        Class<?> clazz = Class.forName(path);
        
        //获取属性上的泛型类型
        Field field = ReflexUtil.getField(clazz, "map");
        Type fieldType = field.getGenericType();
        ParameterizedType fieldTypePT = (ParameterizedType) fieldType;
        Type[] actualTypeArguments = fieldTypePT.getActualTypeArguments();
        for (Type type : actualTypeArguments) {
            System.out.println(type);
        }
        
        System.out.println("---------------------------");
        
        Method method = ReflexUtil.getMethod(clazz, "method05", ArrayList.class,HashMap.class);
        
        //获取方法参数上的泛型类型
        Parameter[] parameters = method.getParameters();
        for (Parameter parameter : parameters) {
            Type parameterizedType = parameter.getParameterizedType();
            ParameterizedType parameterTypePT = (ParameterizedType) parameterizedType;
            Type[] actualTypeArguments2 = parameterTypePT.getActualTypeArguments();
            for (Type type : actualTypeArguments2) {
                System.out.println(type);
            }
            
        }
        
        System.out.println("---------------------------");
        
        //获取方法上返回值的泛型类型
        Type genericReturnType = method.getGenericReturnType();
        ParameterizedType returnPT = (ParameterizedType) genericReturnType;
        Type[] actualTypeArguments2 = returnPT.getActualTypeArguments();
        for (Type type : actualTypeArguments2) {
            System.out.println(type);
        }
        }

六、利用反射操作注解

public static void main(String[] args) throws IOException, ClassNotFoundException {
        Properties p = new Properties();
        p.load(Test05.class.getClassLoader().getResourceAsStream("classPath.properties"));
        String path = p.getProperty("path");
        Class<?> clazz = Class.forName(path);
        
        //获取类上的注解信息
        MyAnnotaction classAnnotation = clazz.getAnnotation(MyAnnotaction.class);
        System.out.println(classAnnotation.str());
        
        System.out.println("--------------------");
        
        //获取属性上的注解信息
        Field field = ReflexUtil.getField(clazz, "map");
        MyAnnotaction fieldAnnotation = field.getAnnotation(MyAnnotaction.class);
        System.out.println(fieldAnnotation.str());
        
        System.out.println("--------------------");
        
        //获取方法上的注解信息
        Method method = ReflexUtil.getMethod(clazz, "method05", ArrayList.class,HashMap.class);
        MyAnnotaction methodAnnotation = method.getAnnotation(MyAnnotaction.class);
        System.out.println(methodAnnotation.str());
        
        System.out.println("--------------------");
        
        //获取参数上的注解信息
        Parameter[] parameters = method.getParameters();
        for (Parameter parameter : parameters) {
            MyAnnotaction parameterAnnotation = parameter.getAnnotation(MyAnnotaction.class);
            if(parameterAnnotation != null) {//说明该参数上有MyAnnotaction的注解
                System.out.println(parameterAnnotation.str());
            }
            
        }
        
        
        
        
    }

七、利用反射操作数组

public static void main(String[] args) {
        
        //创建数组
        int[] arr = (int[]) Array.newInstance(int.class, 10);
        
        //获取数组长度
        int length = Array.getLength(arr);
        System.out.println("获取数组长度:" + length);
        
        //循环设置每个下标上的元素
        for (int i = 0; i < Array.getLength(arr); i++) {
            
            //设置当前下标上的元素
            Array.set(arr, i, i+1);
            
        }
        
        
        //循环设置每个下标上的元素
        for (int i = 0; i < Array.getLength(arr); i++) {
            //获取当前下标上的元素
            Object element = Array.get(arr, i);
            System.out.println(element);
        }
        
    }
​

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/551460.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

解读我国最新网络安全运维与数据处理安全规范:强化数字化时代安全基石

近日&#xff0c;全国网络安全标准化技术委员会秘书处公布了一系列重要的网络安全与数据安全相关技术规范草案&#xff0c;包括《网络安全技术 网络安全运维实施指南》、《网络安全技术 信息系统灾难恢复规范》以及《数据安全技术 政务数据处理安全要求》。这些规范旨在应对当前…

JavaScript权威指南(第7版) 笔记 - 第 7 章 数组

能用代码说清楚的&#xff0c;绝不多废话&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01; Linux创始人Linus的名言&#xff1a;Talk is cheap&#xff0c;show me the code ! &#xff0c;博主技术博文会精心给出能说明问题的范例代码&#xff01;…

安装 k8s集群的问题:默认容器运行时从 Docker 改为 Containerd

安装 k8s集群的问题&#xff1a;默认容器运行时从 Docker 改为 Containerd 1、背景2、容器运行时从 Docker 改为 Containerd2.1、安装 Containerd&#xff1a;2.2、生成 Containerd 的配置文件2.3 、创建 /etc/crictl.yaml 文件2.4 、配置 Containerd 服务开机自启 &#x1f49…

算法与数据结构要点速学——排序算法

排序算法 所有主要的编程语言都有一个内置的排序方法。假设并说排序成本为 O(n*log n)&#xff0c;通常是正确的&#xff0c;其中 n 是要排序的元素数。为了完整起见&#xff0c;这里有一个图表&#xff0c;列出了许多常见的排序算法及其完整性。编程语言实现的算法各不相同&a…

【GDB调试技巧】提高gdb的调试效率

目录 &#x1f31e;gdb的启动 &#x1f31e;gdb技巧 &#x1f33c;1. gdb小技巧汇总 &#x1f33c;2. 打印输出指定地址的值 &#x1f33c;3. 查看当前执行到哪行代码代码内容 3.1 方式一&#xff1a;info line 结合 list 。 3.2 方式二&#xff1a;f 3.3 方式三&#…

WebGIS面试题(第五期)

WebGIS面试题&#xff08;第五期&#xff09; 以下题目仅为部分题目&#xff0c;全部题目在公众号{GISer世界}&#xff0c;答案仅供参考 1、Cesium的核心组件有哪些&#xff1f; Cesium的核心组件包括Viewer、Scene、Model、Geometry、Material和Camera等。其中&#xff0c;…

Latex(从入门到入土)1

第一章&#xff1a;初识Latex 1、安装Latex&#xff0c;当然可以安装官方的开放版本&#xff0c;也可以去找找别人发的资源。我这里只介绍我的学习经过。如果想下载最新的软件资源&#xff0c;我这里推荐微信公众号&#xff1a;软件智库&#xff0c;通过号主提供的网址是可以下…

基于大数据的全国热门景点数据可视化分析系统

温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长 QQ 名片 :) 1. 项目简介 本文将介绍如何使用Python中的Pandas库进行数据挖掘&#xff0c;并结合Flask Web框架实现一个旅游景点数据分析系统。该系统将包括以下功能模块&#xff1a;热门景点概况、景点星级与评分分析、景…

Docker 学习笔记(十):Centos7 中 Docker 部署 Redis 集群,打包 SpringBoot 微服务

一、前言 记录时间 [2024-4-17] 系列文章简摘&#xff1a; Docker 学习笔记&#xff08;六&#xff09;&#xff1a;挑战容器数据卷技术一文通&#xff0c;实战多个 MySQL 数据同步&#xff0c;能懂会用&#xff0c;初学必备 Docker 学习笔记&#xff08;七&#xff09;&#x…

基于Copula函数的风光功率联合场景生成_任意修改生成的场景数目(附带Matlab代码)

基于Copula函数的风光功率联合场景生成 削减为6个场景 部分展示削减为5个场景 部分展示 风光等可再生能源出力的不确定性和相关性给系统的设计带来了极大的复杂性&#xff0c;若忽略这些因素&#xff0c;势必会在系统规划阶段引入次优决策风险。因此&#xff0c;在确定系统最佳…

Linux sort/uniq/wc

文章目录 1. sort 排序将线程ID从大到小排序 2.uniq 临近去重3.wc word cnt 统计 1. sort 排序 将线程ID从大到小排序 grep -v是反向筛选&#xff0c;利用USER&#xff0c;排除掉首行 awk是打印第1 2列 sort -n是代码以数值大小做排序&#xff0c;不加的话会以字符排序。 -k是…

Go 单元测试之HTTP请求与API测试

文章目录 一、httptest1.1 前置代码准备1.2 介绍1.3 基本用法 二、gock2.1介绍2.2 安装2.3 基本使用2.4 举个例子2.4.1 前置代码2.4.2 测试用例 一、httptest 1.1 前置代码准备 假设我们的业务逻辑是搭建一个http server端&#xff0c;对外提供HTTP服务。用来处理用户登录请求…

腾讯实验室推出类似 Sora 的长视频生成Mira;阿里巴巴推出强大的代码生成模型CodeQwen1.5

✨ 1: Mira 腾讯PCG ARC实验室推出Mira&#xff1a;类似 Sora 的长视频生成 Mira&#xff08;Mini-Sora&#xff09;&#xff0c;是一个尝试生成高质量、长时视频的初步探索项目&#xff0c;以Sora风格进行长视频生成。与现有的文本到视频&#xff08;Text-to-Video, T2V&a…

2024年【高处安装、维护、拆除】试题及解析及高处安装、维护、拆除模拟试题

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 2024年【高处安装、维护、拆除】试题及解析及高处安装、维护、拆除模拟试题&#xff0c;包含高处安装、维护、拆除试题及解析答案和解析及高处安装、维护、拆除模拟试题练习。安全生产模拟考试一点通结合国家高处安装…

基于SSM+Jsp+Mysql的贝儿米幼儿教育管理系统

开发语言&#xff1a;Java框架&#xff1a;ssm技术&#xff1a;JSPJDK版本&#xff1a;JDK1.8服务器&#xff1a;tomcat7数据库&#xff1a;mysql 5.7&#xff08;一定要5.7版本&#xff09;数据库工具&#xff1a;Navicat11开发软件&#xff1a;eclipse/myeclipse/ideaMaven包…

如何简单下载指定版本的jdk

Oracle 官方提供的 Java Development Kit (JDK) 的归档站点。它主要用于存放历史版本的 JDK&#xff0c;供开发者下载和使用。 附上站点地址&#xff1a;Archived OpenJDK GA Releases 在这个站点可以找到各版本的jdk&#xff0c;简单实用~ 找到版本&#xff0c;点击tar.gz进…

研究表明,全球互联网流量竟有一半来自机器人

据Cyber News消息&#xff0c;Thales Imperva Bad Bot近期做了一份报告&#xff0c;显示在2023年有49.6%的互联网流量竟来自机器人&#xff0c;比上一年增长 2%&#xff0c;达到自2013年以来观察到的最高水平。 报告称&#xff0c;这一趋势正对企业组织产生负面影响&#xff0c…

Qwen1.5大语言模型微调实践

在人工智能领域&#xff0c;大语言模型&#xff08;Large Language Model&#xff0c;LLM&#xff09;的兴起和广泛应用&#xff0c;为自然语言处理&#xff08;NLP&#xff09;带来了前所未有的变革。Qwen1.5大语言模型作为其中的佼佼者&#xff0c;不仅拥有强大的语言生成和理…

Seata

Seata是一款开源的分布式事务解决方案&#xff0c;致力于提供高性能和简单易用的分布式事务服务。Seata将为用户提供了AT、TCC、SAGA和XA事务模式&#xff0c;为用户打造一站式的分布式解决方案。 1.1 Seata的三大角色 在 Seata 的架构中&#xff0c;一共有三个角色&#xff1…

解决 MSYS2 Qt 6.7 默认 stylesheet 在 windows 11 下的显示故障

项目场景&#xff1a; MSYS2 升级到 Qt6.7.0&#xff0c;发现显示故障&#xff0c;所有Qt6程序以及 QtCreator的SpinBox都显示不全&#xff0c;Combox的底色不对。 问题描述 2024年4月1日&#xff0c;pacman升级MSYS2后&#xff0c;Qt6遇到风格错误。如果使用官方的 Qt onlin…
最新文章