JAVA反射机制--静态加载与动态加载

    xiaoxiao2021-04-04  34

    Java反射是Java被视为动态(或准动态)语言的一个关键性质。这个机制允许程序在运行时透过Reflection APIs取得任何一个已知名称的class的内部信息,包括其modifiers(诸如public, static 等)、superclass(例如Object)、实现之interfaces(例如Cloneable),也包括fields和methods的所有信息,并可于运行时改变fields内容或唤起methods。Java反射机制容许程序在运行时加载、探知、使用编译期间完全未知的classes。通过JAVA的反射机制,可以获得程序内部或第三方JAR包的CLASS,METHOD,属性,参数等信息。这篇文章主要讲动态加载让程序实现动态加载。让程序实现动态加载是实现开发中必须用的。动态加载:程序在运行时调用相应方法,即使其他方法是错误的,程序依旧会执行。通过动态加载可以让程序的可延长性大大提升,对以后的维护和扩展有重要意义。静态加载:程序在编译时执行。在执行过程中加载所有可能执行到的程序。在这种加载方式下,只要加载中一个方法出错,程序就不能运行。我们一般写程序默认的是静态加载。下面我们通过一个案例来分析一下:在office程序中,有Word和Excel两个功能。 [html]  view plain  copy  print ? <span style="font-size:24px;">public class MainLoad {   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");   }   }   }</span>   public class MainLoad {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");}}}现在我们完善Word功能新建一个class,类名为Word,代码如下public class Word implements RunBetter{@Overridepublic void startPro() {// TODO Auto-generated method stubSystem.out.println("Word Test!");}}这个代码直接在电脑上运行会报编译异常,因为我们并没有建Excel类。即使我们直接用控制台java MainLoad.java执行,也会在new Excel();时报错。那么,如果用户只想用Word,并不想使用Excel功能呢。这就强迫我们必须实现Excel的功能,我们的程序才可以运行。这个时候,就可以用动态加载仅仅调用MainLoad中的Word功能新建一个接口,public interface RunBetter {public void startPro();}新建一个程序入口。public static void main(String[] args) {try {//运行时加载,动态加载类Class c1 = Class.forName(args[1]);//通过类类型加载对象。//返回的是包含N个class的接口,以免程序编译错乱RunBetter rb = (RunBetter)c1.newInstance();rb.startPro();}在这个代码中我们通过获得类类型newInstance。然后再执行startPro中的方法。为什么不将RunBetter rb = (RunBetter)c1.newInstance();写成MainLoad rb = (MainLoad)c1.newInstance(); ???因为MianLoad中我们有多个方法,如果直接用这个类强转,那程序可能随机调用这个类中的某一个方法。所以我们需要新建一个接口。当程序扩展的时候,直接在接口增加功能模块,就像我们升级手机上的程序不需要下载完整的安装包一样,这个时候直接添加功能模块就可以,不用在编译了。程序源码:http://download.csdn.net/detail/jacxuan/9714217
    转载请注明原文地址: https://ju.6miu.com/read-666083.html

    最新回复(0)