1. import java.io.*;
  2. import java.util.Properties;
  3.  
  4. /*问题描述:存在一个主板--已经定义好,不想修改其代码,还想在主板上面增加一些其他功能?
  5. *问题解决方法:主板在定义的时候对外提供一个接口,让其他设备实现该接口,并把这些设备的
  6. *信息写在配置文件里面。主板定义的时候读配置文件的信息,动态的获取其他设备的信息,并使用
  7. *其他的功能。这样就完全不用修改主板的代码。极大的提高了程序的扩展性。
  8. *所以通过反射就可以动态获取扩展类的对象,只需要修改具体配置文件的内容即可。
  9. *
  10. *反射:动态的获取类的信息。其实是通过类名,加载类,获取类的Class对象,进而做其他的操作。
  11. * 使用反射的最大的好处是程序的扩展性大大的提高。
  12. *反射涉及的类:Class,java.lang.reflect包里面的Method,Field,Constructor支持
  13. * */
  14. public class UseReflection {
  15.  
  16. public static void main(String[] args) throws IOException, ClassNotFoundException, Exception {
  17. MainBoard mb = new MainBoard();
  18. mb.run();
  19.  
  20. //把添加的设备写在配置文件中,并将该文件封装为对象
  21. File f = new File("pci.properties");
  22. //将配置文件关联到流
  23. FileInputStream fis = new FileInputStream(f);
  24. //创建Properties对象
  25. Properties prop = new Properties();
  26. //将流中的信息加载到prop里面
  27. prop.load(fis);
  28. //遍历从流中得到的信息
  29. for(int i = 0; i < prop.size();i++){
  30. String name = prop.getProperty("pci"+(i+1));
  31. Class clazz = Class.forName(name);
  32. PCI p = (PCI)clazz.newInstance();
  33. mb.usePCI(p);
  34. }
  35.  
  36. }
  37.  
  38. }
  39.  
  40. class MainBoard{
  41. public void run(){
  42. System.out.println("mainboard run-------");
  43. }
  44.  
  45. public void usePCI(PCI p){
  46. if(p != null){
  47. p.open();
  48. p.close();
  49. }
  50. }
  51. }
  1. public interface PCI {
  2.  
  3. public void open();
  4. public void close();
  5. }
  6.  
  7. class SoundBoard implements PCI{
  8.  
  9. public SoundBoard() {
  10.  
  11. }
  12.  
  13. @Override
  14. public void open() {
  15. System.out.println("open sound");
  16.  
  17. }
  18.  
  19. @Override
  20. public void close() {
  21. System.out.println("close sound");
  22. }
  23. }
  24.  
  25. class WifiBoard implements PCI{
  26.  
  27. public WifiBoard() {
  28.  
  29. }
  30.  
  31. @Override
  32. public void open() {
  33. System.out.println("open wifi");
  34.  
  35. }
  36.  
  37. @Override
  38. public void close() {
  39. System.out.println("close wifi");
  40.  
  41. }
  42. }

  上面是一种模拟的反射机制的使用,真实使用反射机制的一个比较常见的例子是Tomcat--web服务器,Tomcat服务器的作用:就是处理浏览器的请求

和给予合适的应答,但是浏览器的请求类型通常不一样,为了提高服务器的扩展性,通常在Tomcat编写时就对外提供一个公共的接口--Servlet,要进行怎样

的响应和处理请求,需要开发人员需要做的就是直接实现该接口,定义合适的处理方式,并将具体实现类信息写在配置文件中,Tomcat在操作的时候根据读取

配置文件的内容,动态的获得合适的处理方式,处理浏览器的请求,开发者的编程难度也下降,直接面对的是接口和配置文件。想要修改具体的处理方式,直接

修改配置文件的内容即可。

Java反射机制使用场景的更多相关文章

  1. Java反射机制概念及应用场景

    Java的反射机制相信大家在平时的业务开发过程中应该很少使用到,但是在一些基础框架的搭建上应用非常广泛,今天简单的总结学习一下. 1. 什么是反射机制? Java反射机制是在运行状态中,对于任意一个类 ...

  2. Java基础学习总结(75)——Java反射机制及应用场景

    什么是Java反射机制? JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意一个方法:这种动态获取的以及动态调用对象的方法的功能称为 ...

  3. 长篇图解java反射机制及其应用场景

    一.什么是java反射? 在java的面向对象编程过程中,通常我们需要先知道一个Class类,然后new 类名()方式来获取该类的对象.也就是说我们需要在写代码的时候(编译期或者编译期之前)就知道我们 ...

  4. 11 java 反射机制

    Java反射机制的适用场景及其利与弊: http://blog.csdn.net/zolalad/article/details/29370565 http://my.oschina.net/u/10 ...

  5. Java反射机制浅析

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

  6. Java反射机制深度剖析

    版权声明:本文为博主原创文章,转载请注明出处,欢迎交流学习! Java反射机制是Java语言中一种很重要的机制,可能在工作中用到的机会不多,但是在很多框架中都有用到这种机制.我们知道Java是一门静态 ...

  7. 【java提高】---java反射机制

    java反射机制 一.概述 1.什么是反射机制 反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意一个方法和属性:这种动态获取的信息以及动态 ...

  8. Java反射机制与工厂模式

    工厂模式属于创建型模式,它提供了一种创建对象的最佳方式. 它的特点是:客户端的程序类不直接牵扯到对象的实例化管理,只与接口发生关联,通过工厂类获取指定接口的实例化对象. 简单工厂模式如下: inter ...

  9. Java反射机制调用对象的方法 —— 将一个对象的属性值赋值给另一个对象的属性

    模拟一个场景: 众所周知,EasyExcel导出Excel文档是依赖于注解完成的,在实体类需要导出的属性上面加上注解,导出的时候会自动识别该属性. 假如我们现在需要导出用户的信息,又不想污染原本的实体 ...

随机推荐

  1. poj3264 最大值与最小值的差

    For the daily milking, Farmer John's N cows (1 ≤ N ≤ 50,000) always line up in the same order. One d ...

  2. [js高手之路]html5 canvas动画教程 - 边界判断与小球粒子模拟喷泉,散弹效果

    备注:本文后面的代码,如果加载了ball.js,那么请使用这篇文章[js高手之路] html5 canvas动画教程 - 匀速运动的ball.js代码. 本文,我们要做点有意思的效果,首先,来一个简单 ...

  3. Python实战之Selenium自动化测试web登录(2)

    #!/usr/bin/env python3 # -*- coding:utf-8 -*- from selenium import webdriver from selenium.webdriver ...

  4. WebApi实现验证授权Token,WebApi生成文档等

    using System; using System.Linq; using System.Web; using System.Web.Http; using System.Web.Security; ...

  5. CSS3实现3D旋转相册

    静态效果图: 代码如下: <!doctype html><html lang="en"><head> <meta charset=&quo ...

  6. Github Page--CSDN新人的第二选择

    我也是个CSDN新人,使用的CSDN的初衷应该和众人类似,就是想总结下平时的学习成果,或者一些想法. CSDN好的地方: 书写界面简洁,支持markdown语法 人还算多,也比较年轻 相对较活跃 内容 ...

  7. 2017值得一瞥的JavaScript相关技术趋势

    2017值得一瞥的JavaScript相关技术趋势从属于笔者的Web 前端入门与工程实践,推荐阅读2016-我的前端之路:工具化与工程化获得更多关于2016年前端总结.本文主要内容翻译自,笔者对于每个 ...

  8. 如何使用 C# 爬虫获得专栏博客更新排行

    昨天,梦姐问我们,她存在一个任务,找到 关注数排行100 和 浏览量排行100 的专栏博客,在2017年还有更新的专栏. 梦姐说他要出去一趟,M大神在吃饭,于是我估算时间,只有半个钟. 整理一下:半个 ...

  9. C#命令行解析工具

    我将告诉大家两个方法去获取C#输入的命令行参数. 第一个方法: 林选臣大神写的,他的方法很简单. 首先复制两个类到项目 public class CommandLineArgumentParser { ...

  10. web前端开发初学者必看的学习路线(附思维导图)

    很多同学想学习WEB前端开发,虽然互联网有很多的教程.网站.书籍,可是却又不知从何开始如何选取.看完网友高等游民白乌鸦无私分享的原标题为<写给同事的前端学习路线>这篇文章,相信你会有所收获 ...