黑马程序员_反射机制
来源:互联网 发布:搜房网网络经纪人登录 编辑:程序博客网 时间:2024/06/17 03:50
反射机制
(一)反射概述
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培训、期待与您交流! -------- 黑马程序员_反射机制
- 黑马程序员_反射机制
- 黑马程序员_反射机制
- 黑马程序员_反射机制
- 黑马程序员_反射机制
- 黑马程序员_反射机制
- 黑马程序员_反射机制
- 黑马程序员_反射机制
- 黑马程序员_高新技术Java反射机制
- 黑马程序员-反射机制_基础
- 黑马程序员-反射机制_动态代理
- 黑马程序员_反射
- 黑马程序员_反射
- 黑马程序员_反射
- 黑马程序员_反射
- 黑马程序员_反射
- 黑马程序员_反射
- 黑马程序员_反射
- android:inputType常用取值
- 性能测试思路
- 移动App开发中的View解耦问题
- powerdesigner中将表的name在生成建表sql时生成注释
- SegmentFault D-Day 杭州站之移动开发专场
- 黑马程序员_反射机制
- 织梦dedecms全站RSS输出订阅美化修改
- storm操作zookeeper源码分析-cluster.clj
- Oracle安装之后的默认账户
- 类、对象和方法
- Piranha配置lvs负载均衡
- typeof 和 instanceOf的区别
- 如何搭建一个struts2的环境
- 织梦DedeCMS v5.7完美实现导航条下拉菜单