参考博客:https://www.cnblogs.com/qwop/p/6637326.html
慕课网视频教程:https://www.imooc.com/video/3733
java中,万事万物皆对象,但是里面有两个特殊的对象:普通数据类型和类。
普通数据类型有封装类作为对象,我们所写的每一个类都是java.lang.Class类的实例对象。
假如我们创建了一个类Foo,那么作为Class类的实例对象,有三种表示方式:
第一种:实际在告诉我们任何一个类都有一个隐含的静态成员变量class
Class c1=Foo.class;
第二种:已知该类的对象,那么可以通过getClass方法
Class c2=foo1.getClass();
第三种:
Class c3=null;
try {
c3=Class.forName("test.ttttt.Foo"); //"类的全称"
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
c1、c2、c3称为类的类类型,可以进行比较,都是相等的,并且,可以通过他们中的任何一个,创建Foo类的实例
Foo foo=(Foo)c1.newInstance();//需要有无参数的构造方法
反射应用的实例:
首先这里要了解静态加载与动态加载
动态加载:程序在运行时调用相应方法,即使其他方法是错误的,程序依旧会执行。通过动态加载可以让程序的可延长性大大提升,对以后的维护和扩展有重要意义。
静态加载:程序在编译时执行。在执行过程中加载所有可能执行到的程序。在这种加载方式下,只要加载中一个方法出错,程序就不能运行。我们一般写程序默认的是静态加载,常用的new创建对象是静态加载
下面是一个程序,根据输入创建相对应的对象
public static void main(String[] args) {
//静态加载。编译时加载,编译时就需要加载全部可能使用到的的类,一个类出错,其他类的功能都不能得到执行
if("Word".equals(args[0])){
Word Word = new Word();
System.out.println("Word");
}
if("Excel".equals(args[0])){
Excel excel = new Excel();
System.out.println("Excel");
}
}
但是当Excel类不存在时,因为静态加载,即使输入是Word,也无法执行,这时候若用动态加载,即不需要考虑Excel,如下代码,其中OfficeAble为Word类和Excel类的共同接口
public static void main(String[] args) {
try {
//运行时加载,动态加载类
Class c1 = Class.forName(args[1]);
//通过类类型加载对象。
OfficeAble rb = (OfficeAble)c1.newInstance();
rb.startPro();
}
显而易见的好处:当程序扩展的时候,直接在接口增加功能模块,就像我们升级手机上的程序不需要下载完整的安装包一样,这个时候直接添加功能模块就可以,不用再次编译了
网友评论