• Java反射机制使用场景


     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 
    41 class MainBoard{
    42     public void run(){
    43         System.out.println("mainboard run-------");
    44     }
    45     
    46     public void usePCI(PCI p){
    47         if(p != null){
    48             p.open();
    49             p.close();
    50         }
    51     }
    52 }
    public interface PCI {
    	
    	public void open();
    	public void close();
    }
    
    
    class SoundBoard implements PCI{
    	
    	
    	public SoundBoard() {
    		
    	}
    
    	@Override
    	public void open() {
    		System.out.println("open sound");
    		
    	}
    
    	@Override
    	public void close() {
    		System.out.println("close sound");
    	}
    }
    
    class WifiBoard implements PCI{
    	
    	public WifiBoard() {
    	
    	}
    
    	@Override
    	public void open() {
    		System.out.println("open wifi");
    		
    	}
    
    	@Override
    	public void close() {
    		System.out.println("close wifi");
    		
    	}
    }
    

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

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

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

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

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

  • 相关阅读:
    IE6,IE7 DIV高度技巧(div高度兼容问题)
    QQ在线咨询插件
    Singleton单件 (创建型模式)
    SQL Server ErrorLog 错误日志(如果数据库所占空间变大)
    IE6 div标签height的Bug
    c# 中 Volatile关键字理解
    翻译:SWFObject 2.0官方文档(用来做flash的js)
    已连接到空闲例程的问题解决办法
    Oracle 的一个非常好的触发器例子
    Oracle中表的非常全面的操作
  • 原文地址:https://www.cnblogs.com/sun1993/p/7828227.html
Copyright © 2020-2023  润新知