Java反射案例:用反射机制调用某个对象的指定方法

news2024/12/31 15:34:58

Java反射案例:用反射机制调用某个对象的指定方法

    • 一. 背景
      • 1. 反射机制有什么用?
      • 2. 反射机制的相关类在哪个包下?
      • 3. 反射机制相关的类有哪些?
      • 4.为什么要通过反射来造对象? ★
    • 二. 案例
      • 1. 需求
      • 2. JDBC 连接测试类
      • 3. 连接大数据环境工具类
      • 4. JDBC连接工具类(反射调用)
      • 5.大数据类(华为和cdh)

一. 背景

1. 反射机制有什么用?

  • 通过Java语言中的反射机制可以操作字节码文件,类似于黑客(可以读和修改字节码.class文件)
  • 可以让程序变得更加灵活

2. 反射机制的相关类在哪个包下?

java.lang.reflect.*

3. 反射机制相关的类有哪些?

java.lang.class 代表整个字节码,代表整个类,包括了以下的方法、构造方法、属性。 (必须先获取)
java.lang.reflect.Method 代表字节码中的方法字节码,代表类中的方法。
java.lang.reflect.Constructor 代表字节码中的构造方法字节码,代表类中的构造方法。
java.lang.reflect.Filed 代表字节码中的属性字节码,即成员变量(静态变量+实例变量)

注意

  • Class类没有公共的构造方法,无法通过new 运算符实例化;只能通过对象 .getClass 方法,或是通过Class.forName(…)来获得实例。
  • Class.forname() 方法会导致类加载!导致静态代码块执行!

4.为什么要通过反射来造对象? ★

因为反射创造对象能体现 动态性 / 灵活性
Java代码只需要写一遍,在不改变Java源代码的基础之上,可以做到不同对象的实例化!符合OCP原则!
而 User u=new User 这种方法把代码写死了,只能创建一个User类型的对象!

二. 案例

1. 需求

在使用JDBC 连接大数据环境的Hive时,只修改一个类名,指定调用类的 getConnection方法,就能创建不同类型的 connection!

2. JDBC 连接测试类

ConnGenrate.getBigdataConn() 方法参数内,
传入 HwDatasourceManageService.Class 即连接 华为 的Hive,
传入 CdhDatasourceManageService.class 则连接 cdh 的Hive!

public class JdbcTest {

    public static void main(String[] args) {
        Statement stmt = null;
        String sql = args[0];
        DatasourceEntity dm = new DatasourceEntity();
        dm.setDatabaseType(DbType.HIVE.getDescp());
        dm.setAuthSchema(AuthType.KERBEROS.getCode());
        dm.setPrincipal("username");
        dm.setKeytabFilePath("/tmp/user.keytab");
        dm.setLinkInfo("jdbc:hive2:连接串");
        dm.setZkPrincipal("zookeeper/hadoop.hadoop.com@HADOOP.COM");
        dm.setConfigFilePath("/tmp/");
//        Boolean status = ConnCheck
//                .checkBigdataConnection(HwDatasourceManageService.class.getName(), dm);
//        System.out.println("连接状态:" + status);
        Connection conn;
        try {
            conn = (Connection) ConnGenrate.getBigdataConn(HwDatasourceManageService.class.getName(), dm);
            conn = (Connection) ConnGenrate.getBigdataConn(CdhDatasourceManageService.class.getName(), dm);
            if (conn != null) {
                stmt = conn.createStatement();
                int count = stmt.executeUpdate(sql);
//                stmt.execute(sql);
//                ResultSet rs = stmt.getResultSet();
//                while (rs.next()){
//                    System.out.println(rs.getObject(1).toString());
//                }
            } else {
                System.out.println("获取连接失败!");
            }
            conn.close();
        } catch (Exception e) {
            try {
            } catch (Exception e2) {
                System.out.println("Error: " + e2.getMessage());
            }
            System.out.println("Error:" + e.getMessage());
        }
    }
}

3. 连接大数据环境工具类

将大数据类名传入该方法,并指定调用类中的 “getConnection” 方法!

public class ConnGenrate {
	public static Object getBigdataConn(String clazzName, Object...params){
    	    String methodName = "getConnection"; //  指定调用大数据类的哪一个方法
        	return DataSourceUtil.invoke(clazzName, methodName, params);
    }
}

4. JDBC连接工具类(反射调用)

①加载大数据类,获取字节码
②示例化大数据类
③遍历字节码拿到大数据类的所有方法
④找到所有方法中的那个指定方法 “getConnection”
⑤通过反射调用大数据对象的 “getConnection” 方法!

public class DataSourceUtil {
    public static Object invoke(String clazzName, String methodName, Object...params){
        try {
            Class<?> clazz=Class.forName(clazzName); // 加载大数据类!获取字节码
            Object obj=clazz.newInstance(); //  实例化大数据类!
            Method[] methods = clazz.getDeclaredMethods(); // 遍历反射拿到类的所有方法!
            Method callMethod=null;
            for(Method method:methods){
                if(method.getName().equals(methodName)){
                    callMethod=method;
                    break;
                }
            }
            callMethod.setAccessible(true);
            return (Object) callMethod.invoke(obj, new Object[]{params});
        } catch (Exception e) {
        	LOGGER.error(e.getMessage());
            e.printStackTrace();
        }
        return null;
    }
}

5.大数据类(华为和cdh)

最终调用的是大数据类中的 “getConnection” 方法!
了解思路即可,具体内容不予以展示;

public class HwDatasourceManageService{
	public Object getConnection(Object... params) throws Exception {...}
}
public class CdhDatasourceManageService{
	public Object getConnection(Object... params) throws Exception {...}
}

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

e3 1220lv3 cpu-z分数

e3 1220lv3 双核四线程&#xff0c;1.1G频率&#xff0c;最低可在800MHZ运行&#xff0c;TDP 13W。 使用PE启动后测试cpu-z分数。 现在e3 1220lv3的价格落到69元。

Debian安装配置RocketMQ

安装配置 本次安装在/tools/rocket目录下 下载 wget https://dist.apache.org/repos/dist/release/rocketmq/5.3.1/rocketmq-all-5.3.1-bin-release.zip 解压缩 unzip rocketmq-all-5.3.1-bin-release.zip 如果出现以下报错 -bash: unzip: command not found可安装unzip工具后执…

cocos 运行时,实时查看、修改节点树

简介 cocos论坛提供的一款辅助查看、修改cocos运行时的节点树工具&#xff0c;同时也可以实时修改运行的节点树并进行修改。在此感谢大佬提供这么实用的工具。 参考链接&#xff1a;【运行时显示节点树插件】ccc-devtools悄悄更新 - Creator 2.x - Cocos中文社区 仓库链接&a…

UE(虚幻)学习(四) 第一个C++类来控制小球移动来理解蓝图和脚本如何工作

UE5视频看了不少&#xff0c;但基本都是蓝图如何搞&#xff0c;或者改一下属性&#xff0c;理解UE系统现有组件使用的。一直对C脚本和蓝图之间的关系不是很理解&#xff0c;看到一个视频讲的很好&#xff0c;我也做笔记记录一下。 我的环境是UE5.3.2. 创建UE空项目 我们创建…

记一次内存泄漏分析(待写稿)

背景 线上Flink频繁重启&#xff0c;先后排查了很多情况&#xff0c;目前在内存阶段排查&#xff0c;首先说说学到的知识 内存泄漏分析 JVM常用命令 JConsole JVisualvm 快照的这里是最有用的&#xff0c;它和jmap不同&#xff0c;jmap查找的是占用字节最多的类&#xff…

【蓝桥杯——物联网设计与开发】拓展模块5 - 光敏/热释电模块

目录 一、光敏/热释电模块 &#xff08;1&#xff09;资源介绍 &#x1f505;原理图 &#x1f505;AS312 &#x1f319;简介 &#x1f319;特性 &#x1f505;LDR &#xff08;2&#xff09;STM32CubeMX 软件配置 &#xff08;3&#xff09;代码编写 &#xff08;4&#x…

C语言从入门到放弃教程

C语言从入门到放弃 1. 介绍1.1 特点1.2 历史与发展1.3 应用领域 2. 安装2.1 编译器安装2.2 编辑器安装 3. 第一个程序1. 包含头文件2. 主函数定义3. 打印语句4. 返回值 4. 基础语法4.1 注释4.1.1 单行注释4.1.2 多行注释 4.2 关键字4.2.1 C语言标准4.2.2 C89/C90关键字&#xf…

第三百四十六节 JavaFX教程 - JavaFX绑定

JavaFX教程 - JavaFX绑定 JavaFX绑定同步两个值&#xff1a;当因变量更改时&#xff0c;其他变量更改。 要将属性绑定到另一个属性&#xff0c;请调用bind()方法&#xff0c;该方法在一个方向绑定值。例如&#xff0c;当属性A绑定到属性B时&#xff0c;属性B的更改将更新属性A…

慧集通客户案例:致远OA与熵基考勤机集成方案

本原型公司是一家专注大健康产业的综合性高新科技形实体企业&#xff0c;按照单位的战略业务布局&#xff0c;围绕“做强做优、世界一流”的目标&#xff0c;加快内外部资源整合、加强业务协同、优化资源配置&#xff0c;有序推进大健康及相关产业的有机融合&#xff0c;加快构…

SCSA: Exploring the Synergistic Effects Between Spatial and Channel Attention

摘要 https://arxiv.org/pdf/2407.05128 通道注意力和空间注意力分别为各种下游视觉任务在提取特征依赖性和空间结构关系方面带来了显著改进。通道注意力和空间注意力的结合使用被广泛认为有利于进一步提升性能&#xff1b;然而&#xff0c;通道注意力和空间注意力之间的协同作…

UE5在蓝图中使用VarestX插件访问API

在Fab中安装好VarestX免费插件 这个插件可以用来远程请求http和api等&#xff0c;返回json等格式内容 插件网址 https://www.fab.com/zh-cn/listings/d283e40c-4ee5-4e73-8110-cc7253cbeaab 虚幻里开启插件 然后网上随便搜个免费api测试一下&#xff0c;这里我找了个微博热搜…

碰一碰发视频矩阵系统源码搭建,支持OEM

一、引言 随着短视频的火爆发展&#xff0c;碰一碰发视频的矩阵系统逐渐受到关注。这种系统能够实现用户通过碰一碰设备&#xff08;如 NFC 标签&#xff09;快速触发视频的发布&#xff0c;在营销推广、互动体验等领域有着广泛的应用前景。本文将详细介绍碰一碰发视频矩阵系统…

Pandas01

文章目录 内容简介1 常用数据分析三方库2 Jupyter notebook3 Series的创建3.1 通过Numpy的Ndarray 创建一个Series3.2 通过列表创建Series 4 Series的属性和方法4.1 常用属性4.2 常用方法4.3 布尔值列表筛选部分数据4.4 Series 的运算 5 DataFrame的创建通过字典创建通过列表[元…

WebPack3项目升级webpack5的配置调试记录

文章目录 前言一、webpack3环境1.1、知识点记录1.1.1、配置解释1.1.2、webpack与sass版本对应关系1.1.3、CommonJS与ESModule1.1.4、node版本管理nvm1.1.5、sass-loader、sass与node-sass 1.2、其他1.2.1、.d.ts是什么文件1.2.2、react与types/react版本对应关系1.2.3、webpack…

plsql :用户system通过sysdba连接数据库--报错ora-01031

一、winR cmd通过命令窗口登录sys用户 sql sys/[password]//localhost:1521/[service_name] as sysdba二、输入用户名:sys as sysdba 三、输入密码:自己设的 四、执行grant sysdba to system; 再去PL/SQL连接就可以了

Quo Vadis, Anomaly Detection? LLMs and VLMs in the Spotlight 论文阅读

文章信息&#xff1a; 原文链接&#xff1a;https://arxiv.org/abs/2412.18298 Abstract 视频异常检测&#xff08;VAD&#xff09;通过整合大语言模型&#xff08;LLMs&#xff09;和视觉语言模型&#xff08;VLMs&#xff09;取得了显著进展&#xff0c;解决了动态开放世界…

药片缺陷检测数据集,8625张图片,使用YOLO,PASICAL VOC XML,COCO JSON格式标注,可识别药品是否有缺陷,是否完整

药片缺陷检测数据集&#xff0c;8625张图片&#xff0c;使用YOLO&#xff0c;PASICAL VOC XML&#xff0c;COCO JSON格式标注&#xff0c;可识别药品是否有缺陷&#xff0c;是否完整 有缺陷的标注信息&#xff1a; 无缺陷的标注信息 数据集下载&#xff1a; yolov11:https://d…

蓝桥杯速成教程{三}(adc,i2c,uart)

目录 一、adc 原理图​编辑引脚配置 Adc通道使能配置 实例测试 ​编辑效果显示 案例程序 badc 按键相关函数 测量频率占空比 main 按键的过程 显示界面的过程 二、IIC通信-eeprom 原理图AT24C02 引脚配置 不可用状态&#xff0c;用的软件IIC 官方库移植 At24c02手册 ​编辑…

第6章 图论

2024年12月25日一稿 &#x1f430;6.1 图的基本概念 6.1.1 图的定义和表示 6.1.2 图的同构 6.1.3 完全图与正则图 6.1.4 子图与补图 6.1.5 通路与回路 6.2 图的连通性 6.2.1 无向图的连通性 6.2.2 有向图的连通性 6.3 图的矩阵表示 6.3.1 关联矩阵 6.3.2 有向图的邻接矩阵…

数据库原理及应用(MySQL版-李月军)-习题参考答案

数据库原理及应用&#xff08;MySQL版&#xff09;-微课视频版 习题参考答案 习 题一 一&#xff0e;选择题 1、D 2、C 3、C 4、B 5、D 6、B 7、A 8、B 9、C 10、A 11、B 12、C 13、①A②B③C 14、①E②B 15、①B②C③B 16、B 17、A 18、D 二&#xff0e;填空题 1、文件…