整理一下大二所做的手抄笔记1(反射机制及为什么要使用反射)

本来想就“大三笔记”这个专栏一直写下去的,后来想想,很多现在接触到的知识都是需要了解一下底层原理才能更好地掌握的,于是乎,鞭策鞭策自己,将自己大二期间作的手抄笔记慢慢都更新到csdn中,方便阅览,当然了,“大三笔记”也是会一直更的,期间也会更这个专栏。

什么是反射

JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。

要想解剖一个类,必须先要获取到该类的字节码文件对象。而解剖使用的就是Class类中的方法.所以先要获取到每一个字节码文件对应的Class类型的对象.

class Office{

    public static void main(String []args){
        if(args[0].equals("word")){
            word w = new word();
            w.start();

}

  if(args[0].equals("excel")){
            excel e = new excel();
            e.start();

}

}

假如我们想要运行office类,那么我们是否一定要创建word和excel类? 如果我们不采用反射机制,那么答案就是肯定的,我们必须创建word和excel,但是呢,假如我们实际上只想调用word里面的start方法呢?

可能有小伙伴说,那我们便创建一个word类呗。

class word{
    public void start("word start..");
}
javac office.java
java office word

如上图所示,我们将"word"作为arg[0]传进去,然后运行office,可以运行吗? 不行,其实实际上编译都无法通过,因为会报classnotfoundexception,找不到excel。相信大家已经察觉到问题了吧?我明明只想调用word里面的方法,excel方法我暂时不想用,我的理想状态是我想用word的时候就只加载word,到我用excel的时候你再来报错。难道我就非要创建一个excel类吗? 那么假如我office类里面有多个方法呢? 那岂不是每次添加都要编译一次office? 

这里的关键点是:我们通过new出来的实例对象,是属于静态编译,在编译时就需要加载所有类中可能会用到的类,如果找不到类则报错,那如何解决? 没错,动态编译

请大家弄清一个概念:

编译时刻加载类是静态加载类,运行时刻加载类是动态加载类。

下面我们来写一个能够动态加载类的office类。

class OfficeBetter{
public static void main(String []args){
    try{
//动态加载类,在运行时刻加载
           Class c = Class.forName(args[0]);
            word w = (word)c.newInstance();
               w.start();
        }
        catch(Exception e){...}

}}

这样写有问题吗? 有的,因为这样子虽然是动态加载了,可是你这跟excel没有关系了呀,万一我又突然想调用excel里面的方法呢?难道我要把c.newInstance()强转为excel,然后再编译? 别急,下面请看。

interfacce officeAble{
        public void start();
}
class OfficeBetter{
public static void main(String []args){
    try{
//动态加载类,在运行时刻加载
           Class c = Class.forName(args[0]);
            OfficeAble oa = (OfficeAble)c.newInstance();
               oa.start();
        }
        catch(Exception e){...}

}}

没错,相信大家也已经明白了---让word和excel实现officeable接口,这样你不管传的args[0]是word还是excel,或者是你以后想扩展一些类,你大可以新建一个任意类,只要它实现了officeable接口,你就可以在officeBetter中调用。

猜你喜欢

转载自blog.csdn.net/weixin_40378837/article/details/82840628