容我喝一杯 java_花一杯茶的时间,学会Java反射(实用篇)
前言
之前,我写了一篇关于java反射的使用——花一杯茶的时间,学会Java反射(基础篇),今天就拿一些实例和应用给大家看看如何在项目中用反射。
实例
反射可以提高代码的扩展性,低耦合,高内聚。就拿工厂模式来说。
首先是简单工厂模式,没有使用反射。
/**
* 动物接口
*
* @author chenjunxu
*
*/
public interface IAnimal {
/**
* 品种
*/
public void kind();
}
/**
* 猫类
*
* @author chenjunxu
*
*/
public class Cat implements IAnimal {
@Override
public void kind() {
System.out.println("I am cat!");
}
}
/**
* 狗类
*
* @author chenjunxu
*
*/
public class Dog implements IAnimal {
@Override
public void kind() {
System.out.println("I am dog!");
}
}
/**
* 动物工厂类
*
* @author chenjunxu
*
*/
public class AnimalFactory {
/**
* 根据名称获取动物的实例
*
* @param className
* @return
*/
public static IAnimal chooseAnimal(String className) {
if (className.equalsIgnoreCase("Dog")) {
return new Dog();
} else if (className.equalsIgnoreCase("Cat")) {
return new Cat();
}
return null;
}
}
/**
* 主类
*
* @author chenjunxu
*
*/
public class Main {
public static void main(String[] args) {
IAnimal animal = AnimalFactory.chooseAnimal("Cat");
if (null != animal) {
animal.kind();
} else {
System.out.println("没有此动物!");
}
}
}
假设我们要新增一个动物:mouse。那么我们需要新建一个mouse类,然后在AnimalFactory工厂类中,加多一个if...else...的判断。假设需要添加十多个动物呢?大家也知道,if...else...用的越多,可能代码的可读性就越差,而且容易出错。
那么能不能每次添加一个新的动物类,然后不需要修改工厂类呢?答案就是反射。
接口IAnimal和类Cat、Dog、Main不改变,将工厂类修改成以下:
/**
* 动物工厂类
*
* @author chenjunxu
*
*/
public class AnimalFactory {
/**
* 根据动物类名获取动物的实例
*
* @param className(包名+类名)
* @return
*/
public static IAnimal chooseAnimal(String className) {
try {
Class> clazz = Class.forName(className);
return (IAnimal) clazz.newInstance();
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (InstantiationException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
}
return null;
}
}
只要你的参数正确(记住是包名+类名),就可以获取到对应类的实例。
现在假设一种场景。有一个APP的通用框架,可以用来做多种多样的APP。现在,有一些APP需要分享功能,有一些不需要分享功能。那我们最好以插件的形式,将分享功能封装成jar包或者library。
分享的jar包(分享库):
package com.share.lib;
/**
* 分享库的分享类
*
* @author chenjunxu
*
*/
public class ShareLib {
/**
* 显示分享框
*
* @param content
*/
public static void showShareDialog(String content) {
System.out.println(content);
}
}
工具类:调用分享库ShareLib的分享方法:
package com.share.demo;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
/**
* 分享工具类
*
* @author chenjunxu
*
*/
public class ShareUtils {
/**
* 分享
*
* @param content
* 分享内容
*/
public static void share(String content) {
try {
Class> clazz = Class.forName("com.share.lib.ShareLib");
Method method = clazz.getMethod("showShareDialog", String.class);
method.invoke(null, content);
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (NoSuchMethodException e) {
e.printStackTrace();
} catch (SecurityException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (IllegalArgumentException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
}
}
}
主方法调用工具类的分享方法:
package com.share.demo;
/**
* 主类
*
* @author chenjunxu
*
*/
public class Main {
public static void main(String[] args) {
ShareUtils.share("我要分享内容!");
}
}
若是我们不需要使用分享功能,那就不需要修改工具类,直接不调用ShareUtils.share方法就行了。
容我喝一杯 java_花一杯茶的时间,学会Java反射(实用篇)相关推荐
- 搭积木蓝桥杯java_蓝桥杯:搭积木
小明最近喜欢搭数字积木, 一共有10块积木,每个积木上有一个数字,0~9. 搭积木规则: 每个积木放到其它两个积木的上面,并且一定比下面的两个积木数字小. 最后搭成4层的金字塔形,必须用完所有的积木. ...
- ricky java_恕我直言你可能真的不会java第8篇-函数式接口
一.函数式接口是什么? 所谓的函数式接口,实际上就是接口里面只能有一个抽象方法的接口.我们上一节用到的Comparator接口就是一个典型的函数式接口,它只有一个抽象方法compare. 只有一个抽象 ...
- 15元钱一杯咖啡,喝完后两个空杯换一杯,问:你有100元钱,最多可以喝到几杯咖啡
15元钱一杯咖啡,喝完后两个空杯换一杯,问:你有100元钱,最多可以喝到几杯咖啡 public static void main(String args[]){int count = 100/15; ...
- 地宫寻宝java_蓝桥杯 2014年 第五届 迷宫寻宝 详解(JAVA)
蓝桥杯 2014年 第五届 迷宫寻宝 详解(JAVA) 基础思路(DFS) package provincial_2014B; import java.util.Scanner; /** * 该题有两 ...
- 第十三届蓝桥杯 2022年省赛真题(Java 大学C组)
蓝桥杯 2022年省赛真题(Java 大学C组) 目录 试题 A: 排列字母 试题 B: 特殊时间 试题 C: 纸张尺寸 试题 D: 求和 试题 E: 矩形拼接 试题 F: 选数异或 试题 G: GC ...
- 第七届蓝桥杯 2016年省赛真题(Java 大学C组)
蓝桥杯 2016年省赛真题(Java 大学C组) 第一题:有奖猜谜 第二题:煤球数目 第三题:平方怪圈 第四题:骰子游戏 第五题:分小组 第六题:凑算式 第七题:搭积木 第八题:冰雹数 第九题:四平方 ...
- “福鼎一杯”:“一杯严选”与“茶人的栖息地”——见茶卸甲 | AiHi资讯
有个迷人的新词名为"见茶卸甲",出处想必许多人都知道,在此暂不详述,只是分享几则茶讯给茶友. "福鼎一杯"生态与"一杯严选"的茶品与&quo ...
- 2021年 第十二届蓝桥杯第二期校内模拟赛题解(Java版)
时隔多日,终于会写一些简单DP了哈哈哈! 稍微改版,方便阅读,若有错,请指出 2019年 第十届蓝桥杯省赛题解(JavaB组版) 2020年 第十一届蓝桥杯第一场省赛题解(JavaB组版) 2020年 ...
- 蓝桥杯备赛--AcWing 668. 游戏时间2
文章目录 蓝桥杯备赛--AcWing 668. 游戏时间2 lanqiao备赛系列说明 题目 题目描述 输入格式 输出格式 数据范围 下面进行解法思路的详解(这里提供三种思路及解决方案) 一.直接按照 ...
最新文章
- 充电电池和充电时间说明
- UA MATH636 信息论9 有限域简介
- cpu win10 安装yolo_Win10+YOLOv3完整安装过程(亲测可运行)
- RHEL 6.0安装Qt
- Django二次开发对接FastDFS
- Java字符串分割(split)
- 11个前端开发者必备的网站
- [转]ASP.NET Web API系列教程(目录)
- unity把两个相机渲染的场景显示在同个窗口
- 第一次接触低代码平台 AppCube,还是有点门槛的
- ble协议栈从零开始七(linklayer 之 privacy)
- 100923G-Por Costel and the Orchard
- nginx的工作原理与nginx的配置
- MacBook Pro无法开机的解法办法
- SAP权限管理的基本概念
- Atom汉化之Atom-Simplified-Chinese-Menu
- Word2Vec中的gensim报错from gensim.models.word2vec import Vocab报错问题
- 家庭公网IP动态解析至阿里云DNS
- Redux详解,有这一篇就够了
- echarts java导出功能_echarts图表导出excel示例
热门文章
- mybatis开发dao的方法——(三)
- iOS设计模式 - 生成器
- EchoesWorks —— 打造下一代技术Blog/Presentation 框架(招兵买马)
- 认识nio中buf的三个常用属性
- 将本地的MS SQL Server数据导入到远程服务器上
- opencv和python是什么关系_opencv和python的区别
- 世界人口钟实时数据_用数字孪生重新定义智慧城市,美象VR推出MxDATA智慧城市CIM数据可视化平台...
- 微型计算机显卡必须插在主板的,第一章 计算机基础知识(2)
- vuepdf转换html,Vue网页html转换PDF(最低兼容ie10)的思路详解
- jQuery中$.fn的用法示例介绍