黑马程序员_反射机制

来源:互联网 发布:搜房网网络经纪人登录 编辑:程序博客网 时间:2024/06/17 03:50
------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------

反射机制

(一)反射概述

  JAVA反射机制是在运行状态中,对于任意一个类 (class文件),都能够知道这个类的所有属性和方法;

 *对于任意一个对象,都能够调用它的任意一个方法和属性;

 *这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。 

 * 动态获取类中信息,就是java反射 。

 *可以理解为对类的解剖。

 * 要想要对字节码文件进行解剖,必须要有字节码文件对象.

 *如何获取字节码文件对象呢?

  JAVA反射机制可以方便程序的扩展,当一个程序已经编译好,需要添加新功能,我们不用获取源代码,进行改写重新编译,只需要配置一个配置文件,继承暴露的接口,就可以添加功能了。如此看来java反射机制可以方便的对已经编译好的程序进行扩展修改。

 

(二)反射的实现

 

需求:

需要做一个职员管理程序,但是不知道有什么功能。我们可以只写出主函数,日后有什么新功能添加再用反射实现,并暴露出addFunctionDemo接口。

当程序使用了一段时间,我们需要给程序添加一个工资管理功能,但是又没有源代码,还好源程序使用了反射,并且暴露出了接口addFunctionDemo,那么我们可以直接利用接口和反射实现添加工资管理功能。

  当一段时间后,有需要添加计算器、增加新员工、删除员工功能,实现方法同上。

 

代码展示

主程序包含三个文件一个offerDemo 实现控制框架,一个MainFunction调用新增的功能,一个addFunctionDemo接口。

offerDemo代码:

 

import java.io.File;import java.io.FileInputStream;import java.io.IOException;import java.util.Properties; public class OfferDemo {/* * 1加载并读取配置文件ini。conf * 2加载主类并调用run方法 */public static void main(String[] args) throws IOException, ClassNotFoundException, InstantiationException, IllegalAccessException{MainFunction mf=new MainFunction();//读取配置文件File file=new File("ini.conf");FileInputStream fis=new FileInputStream(file);Properties prop=new Properties();prop.load(fis);//加载ini。conf中存在的类for (int i = 0; i < prop.size(); i++) {String cName=prop.getProperty("key"+i);Class cf=Class.forName(cName);addFunctionDemo afd=(addFunctionDemo)cf.newInstance();mf.run(afd);}mf.close(); }}

 

MainFunction代码:

 

public class MainFunction { public MainFunction(){System.out.println("职员管理程序主程序运行。。。。。");}public void run(addFunctionDemo afd) {afd.open();afd.run();afd.close();} public void close() {System.out.println("主程序退出");} }

 

addFunctionDemo代码:

public interface addFunctionDemo {public void open();public void run();public void close(); }


 

*注意:如果做程序时没有写包,那么在class当前目录下添加一个ini.conf文件,现在这就算是一个能独立运行的程序了。

现在我需要对它增加新的功能,只需要完成以下几步就可以了

1. ini.conf 文件内填上相应的名称如

key0=liuhe.net.function.Salary      

key1=liuhe.net.function.Cal

key2=liuhe.net.function.NewPeo

key3=liuhe.net.function.DelPeo

注意:因为我再每个文件头部声明了包,所以这里加上包名,如果你没有声明包,可以直接key0=Salary,依次类推

2. 每个新功能的类文件都要实现addFunctionDemo接口内所有方法

代码演示:

Salary 代码

public class Salary implements addFunctionDemo{public void open() {System.out.println("工资管理打开");} public void run() {System.out.println("工资管理运行");} public void close() {System.out.println("工资管理关闭");}} 


 

Cal代码

 

public class Cal implements addFunctionDemo {public void open() {System.out.println("计算器打开");} public void run() {System.out.println("计算器运行");} public void close() {System.out.println("计算器关闭");} }

 

 

NewPeo代码

 

public class NewPeo implements addFunctionDemo{public void open() {System.out.println("增加新员工打开");} public void run() {System.out.println("增加新员工运行");} public void close() {System.out.println("增加新员工关闭");} } 

 

DelPeo代码

 

 

public class DelPeo implements addFunctionDemo{public void open() {System.out.println("删除员工工打开");} public void run() {System.out.println("删除员工运行");} public void close() {System.out.println("删除员工关闭");} }

 

 

  再次运行的时候发现以前没有的功能现在都有了,当然这只是简单的示范,实际应用中要比这复杂的多,像eclipse能随意添加各种插件,以实现不同的功能,这就是应用到了java中的反射机制

------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------
0 0
原创粉丝点击