前言

之前,我写了一篇关于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反射(实用篇)相关推荐

  1. 搭积木蓝桥杯java_蓝桥杯:搭积木

    小明最近喜欢搭数字积木, 一共有10块积木,每个积木上有一个数字,0~9. 搭积木规则: 每个积木放到其它两个积木的上面,并且一定比下面的两个积木数字小. 最后搭成4层的金字塔形,必须用完所有的积木. ...

  2. ricky java_恕我直言你可能真的不会java第8篇-函数式接口

    一.函数式接口是什么? 所谓的函数式接口,实际上就是接口里面只能有一个抽象方法的接口.我们上一节用到的Comparator接口就是一个典型的函数式接口,它只有一个抽象方法compare. 只有一个抽象 ...

  3. 15元钱一杯咖啡,喝完后两个空杯换一杯,问:你有100元钱,最多可以喝到几杯咖啡

    15元钱一杯咖啡,喝完后两个空杯换一杯,问:你有100元钱,最多可以喝到几杯咖啡 public static void main(String args[]){int count = 100/15; ...

  4. 地宫寻宝java_蓝桥杯 2014年 第五届 迷宫寻宝 详解(JAVA)

    蓝桥杯 2014年 第五届 迷宫寻宝 详解(JAVA) 基础思路(DFS) package provincial_2014B; import java.util.Scanner; /** * 该题有两 ...

  5. 第十三届蓝桥杯 2022年省赛真题(Java 大学C组)

    蓝桥杯 2022年省赛真题(Java 大学C组) 目录 试题 A: 排列字母 试题 B: 特殊时间 试题 C: 纸张尺寸 试题 D: 求和 试题 E: 矩形拼接 试题 F: 选数异或 试题 G: GC ...

  6. 第七届蓝桥杯 2016年省赛真题(Java 大学C组)

    蓝桥杯 2016年省赛真题(Java 大学C组) 第一题:有奖猜谜 第二题:煤球数目 第三题:平方怪圈 第四题:骰子游戏 第五题:分小组 第六题:凑算式 第七题:搭积木 第八题:冰雹数 第九题:四平方 ...

  7. “福鼎一杯”:“一杯严选”与“茶人的栖息地”——见茶卸甲 | AiHi资讯

    有个迷人的新词名为"见茶卸甲",出处想必许多人都知道,在此暂不详述,只是分享几则茶讯给茶友. "福鼎一杯"生态与"一杯严选"的茶品与&quo ...

  8. 2021年 第十二届蓝桥杯第二期校内模拟赛题解(Java版)

    时隔多日,终于会写一些简单DP了哈哈哈! 稍微改版,方便阅读,若有错,请指出 2019年 第十届蓝桥杯省赛题解(JavaB组版) 2020年 第十一届蓝桥杯第一场省赛题解(JavaB组版) 2020年 ...

  9. 蓝桥杯备赛--AcWing 668. 游戏时间2

    文章目录 蓝桥杯备赛--AcWing 668. 游戏时间2 lanqiao备赛系列说明 题目 题目描述 输入格式 输出格式 数据范围 下面进行解法思路的详解(这里提供三种思路及解决方案) 一.直接按照 ...

最新文章

  1. 充电电池和充电时间说明
  2. UA MATH636 信息论9 有限域简介
  3. cpu win10 安装yolo_Win10+YOLOv3完整安装过程(亲测可运行)
  4. RHEL 6.0安装Qt
  5. Django二次开发对接FastDFS
  6. Java字符串分割(split)
  7. 11个前端开发者必备的网站
  8. [转]ASP.NET Web API系列教程(目录)
  9. unity把两个相机渲染的场景显示在同个窗口
  10. 第一次接触低代码平台 AppCube,还是有点门槛的
  11. ble协议栈从零开始七(linklayer 之 privacy)
  12. 100923G-Por Costel and the Orchard
  13. nginx的工作原理与nginx的配置
  14. MacBook Pro无法开机的解法办法
  15. SAP权限管理的基本概念
  16. Atom汉化之Atom-Simplified-Chinese-Menu
  17. Word2Vec中的gensim报错from gensim.models.word2vec import Vocab报错问题
  18. 家庭公网IP动态解析至阿里云DNS
  19. Redux详解,有这一篇就够了
  20. echarts java导出功能_echarts图表导出excel示例

热门文章

  1. mybatis开发dao的方法——(三)
  2. iOS设计模式 - 生成器
  3. EchoesWorks —— 打造下一代技术Blog/Presentation 框架(招兵买马)
  4. 认识nio中buf的三个常用属性
  5. 将本地的MS SQL Server数据导入到远程服务器上
  6. opencv和python是什么关系_opencv和python的区别
  7. 世界人口钟实时数据_用数字孪生重新定义智慧城市,美象VR推出MxDATA智慧城市CIM数据可视化平台...
  8. 微型计算机显卡必须插在主板的,第一章 计算机基础知识(2)
  9. vuepdf转换html,Vue网页html转换PDF(最低兼容ie10)的思路详解
  10. jQuery中$.fn的用法示例介绍