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

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.rhkb.cn/news/497230.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

3.若依前端项目拉取、部署、访问

因为默认RuoYi-Vue是使用的Vue2,所以需要另外去下载vue3来部署。 拉取代码 git clone https://gitee.com/ys-gitee/RuoYi-Vue3.git 安装node才能执行npm相关的命令 执行命令npm install 如果npm install比较慢的话&#xff0c;需要添加上国内镜像 npm install --registrhttp…

Docker安装体验kuboard-k8s多集群管理工具

文章目录 1.kuboard是什么&#xff1f;2.docker安装命令2.1 Linux上docker环境安装命令2.2 Windows上docker环境安装命令 3.登录访问3.1首页访问地址3.2 默认账号密码3.3 登录页3.4 首页 4总结 1.kuboard是什么&#xff1f; 参看官网: https://kuboard.cn/gitHub项目地址&…

重学设计模式-责任链模式

责任链模式&#xff08;Chain of Responsibility Pattern&#xff09;是一种行为设计模式&#xff0c;它通过将请求沿着链传递&#xff0c;使多个对象都有机会处理该请求&#xff0c;从而避免了请求的发送者与接收者之间的耦合关系。本文将详细介绍责任链模式的定义、优缺点、应…

SuperMap iClient3D for Cesium等高线标注

kele 前言 在三维地形分析中&#xff0c;等高线分析是一种非常重要的分析方法&#xff0c;它能直观的表达出地形的高低起伏特征&#xff0c;在三维系统中受到广泛应用。在SuperMap iClient3D for Cesium中&#xff0c;等高线分析是前端GPU分析&#xff0c;能够分析并渲染出等高…

简易共享屏幕工具改进版

昨天心血来潮写了一篇关于简易共享屏幕工具的文章&#xff0c;发现也有一些阅读量&#xff0c;并且我对于它的效果不是很满意 &#xff0c;实际呈现的帧率还是太低了。所以我今天换了更高效的方式来实现。 50 行代码简易屏幕共享工具 改进 降低分辨率 昨天那个测试的帧率低&a…

4.银河麒麟V10(ARM) 离线安装 MySQL

1. 系统版本 [rootga-sit-cssjgj-db-01u ~]# nkvers ############## Kylin Linux Version ################# Release: Kylin Linux Advanced Server release V10 (Lance)Kernel: 4.19.90-52.39.v2207.ky10.aarch64Build: Kylin Linux Advanced Server release V10 (SP3) /(La…

图像处理-Ch5-图像复原与重建

Ch5 图像复原 文章目录 Ch5 图像复原图像退化与复原(Image Degradation and Restoration)噪声模型(Noise Models)i.i.d.空间随机噪声(Generating Spatial Random Noise with a Specified Distribution)周期噪声(Periodic Noise)估计噪声参数(Estimating Noise Parameters) 在仅…

「下载」智慧园区及重点区域安全防范解决方案:框架统一规划,建设集成管理平台

智慧园区在基础设施建设和管理上仍存在诸多挑战。园区内场景碎片化、系统独立化、数据无交互、应用无联动等问题普遍存在&#xff0c;导致管理效率低下&#xff0c;安全隐患频发。 各安保系统如视频监控系统、报警管理系统、门禁管理系统等独立运行&#xff0c;数据不共享&…

LeetCode - Google 校招100题 第6天 回溯法(Backtracking) (8题)

欢迎关注我的CSDN:https://spike.blog.csdn.net/ 本文地址:https://spike.blog.csdn.net/article/details/144743505 LeetCode 合计最常见的 112 题: 校招100题 第1天 链表(List) (19题)校招100题 第2天 树(Tree) (21题)校招100题 第3天 动态规划(DP) (20题)

Elasticsearch检索之三:官方推荐方案search_after检索实现(golang)

Elasticsearch8.17.0在mac上的安装 Kibana8.17.0在mac上的安装 Elasticsearch检索方案之一&#xff1a;使用fromsize实现分页 快速掌握Elasticsearch检索之二&#xff1a;滚动查询(scrool)获取全量数据(golang) 1、search_after检索 在前面的文章介绍了fromsize的普通分页…

网易企业邮箱登陆:保障数据安全

网易企业邮箱是一款为企业提供安全可靠的电子邮件服务的工具。通过网易企业邮箱&#xff0c;企业可以实现员工之间的高效沟通和信息共享&#xff0c;同时保障数据的安全性。 企业邮箱的安全性是企业信息保护的重要组成部分。网易企业邮箱采用了多层加密技术&#xff0c;确保邮件…

3.银河麒麟V10 离线安装Nginx

1. 下载nginx离线安装包 前往官网下载离线压缩包 2. 下载3个依赖 openssl依赖&#xff0c;前往 官网下载 pcre2依赖下载&#xff0c;前往Git下载 zlib依赖下载&#xff0c;前往Git下载 下载完成后完整的包如下&#xff1a; 如果网速下载不到请使用网盘下载 通过网盘分享的文件…

Hive其十,优化和数据倾斜

目录 Hive优化 1、开启本地模式 2、explain分析SQL语句 3、修改Fetch操作 4、开启hive的严格模式【提高了安全性】 5、JVM重用 6、分区、分桶以及压缩 7、合理设置map和reduce的数量 合理设置map数量&#xff1a; 设置合理的reducer的个数 8、设置并行执行 9、CBO优…

uniapp通过v-if进行判断时,会出现闪屏?【已解决】

1.问题&#xff1a;按钮切换时&#xff0c;通过v-if来判断&#xff0c;会出现闪烁情况&#xff0c;影响用户体验 2.v-if 闪烁问题可能的原因 ‌条件切换频繁‌&#xff1a;如果 v-if 指令的条件在短时间内频繁切换&#xff0c;会导致元素不断被销毁和重新创建&#xff0c;从而…

ida的使用

一.ida的基本设置 在IDA的安装根目录下有许多文件夹&#xff0c;各个文件夹存储不同的内容 1.目录结构 cfg&#xff1a;包含各种配置文件&#xff0c;基本IDA配置文件ida.cfg,GUI配置文件idagui.cfg&#xff0c;文本模式用户界面配置文件idatui.cfg, idc&#xff1a;包含…

Faster R-CNN

文章目录 摘要Abstract1. 引言2. 框架2.1 RPN2.1.1 网络结构2.1.2 损失函数2.1.3 训练细节 2.2 训练过程 3. 创新点和不足3.1 创新点3.2 不足 参考总结 摘要 Faster R-CNN是针对Fast R-CNN缺点改进的目标检测模型。为了解决候选区域生成耗时长的问题&#xff0c;Faster R-CNN提…

嵌入式AI STM32部署卷积神经网络的魔法棒

基于STM32部署卷积神经网络控制设备方案-AI项目-STM32部署卷积神经网络方案-红外信号复制方案-轨迹识别 项目包含下述内容 硬件部分、PCB制板、BOM表文件等等 (Hardware)外壳、3D打印文件 (3D_print)软件程序、用于电子法棒的软件程序 AI Keil等等(Software)QT上位机动作识别…

GCP Cloud Observability 是什么,有什么使用场景

GCP Cloud Observability 是 Google Cloud Platform (GCP) 提供的一组工具和服务&#xff0c;用于监控、日志记录、追踪和调试应用程序和基础设施的健康和性能。通过收集和分析遥测数据&#xff08;如指标、日志和追踪信息&#xff09;&#xff0c;Cloud Observability 有助于理…

UE4_用户控件_2_按钮的动态效果

效果展示&#xff1a; 操作步骤&#xff1a; 1、新建一个触发Actor&#xff0c;更名为BP_EventTrigger。 这个蓝图类可以拖拽到场景中好多次&#xff0c;生成好多实例。但是我希望每次触发创建的用户控件都是不同的。添加Capsule Collision。 修改胶囊体半高和半径都为156 BP_…

Bert各种变体——RoBERTA/ALBERT/DistillBert

RoBERTa 会重复一个语句10次&#xff0c;然后每次都mask不同的15%token。丢弃了NSP任务&#xff0c;论文指出NSP任务有时甚至会损害性能。使用了BPE ALBERT 1. 跨层参数共享 可以共享多头注意力层的参数&#xff0c;或者前馈网络层的参数&#xff0c;或者全部共享。 实验结果…