• Java反射机制


    一、是什么

      Java Reflaction in Action有这么一句话,可以解释。反射是运行中的程序检查自己和软件运行环境的能力,它可以根据它发现的进行改变。通俗的讲就是反射可以在运行时根据指定的类名获得类的信息。

    二、为什么

      我们为什么要使用反射,它的作用是什么,它在实际的编程中有什么应用。

      首先我们先明确两个概念,静态编译和动态编译。

      静态编译:在编译时确定类型,绑定对象,即通过。 
      动态编译:运行时确定类型,绑定对象。动态编译最大限度发挥了java的灵活性,体现了多    
      态的应用,有以降低类之间的藕合性。   

      我们可以明确的看出动态编译的好处,而反射就是运用了动态编译创建对象。

      那么我们再来看看实际中反射又有什么好处那?

      往往对比能更加直观的向我们展示两者的不同。

    转载

      若不用反射,他是这样的

    interface fruit{  
        public abstract void eat();  
    }  
        
    class Apple implements fruit{  
        public void eat(){  
            System.out.println("Apple");  
        }  
    }  
        
    class Orange implements fruit{  
        public void eat(){  
            System.out.println("Orange");  
        }  
    }  
        
    // 构造工厂类  
    // 也就是说以后如果我们在添加其他的实例的时候只需要修改工厂类就行了  
    class Factory{  
        public static fruit getInstance(String fruitName){  
            fruit f=null;  
            if("Apple".equals(fruitName)){  
                f=new Apple();  
            }  
            if("Orange".equals(fruitName)){  
                f=new Orange();  
            }  
            return f;  
        }  
    }  
    class hello{  
        public static void main(String[] a){  
            fruit f=Factory.getInstance("Orange");  
            f.eat();  
        }  
        
    }  

      用了反射他是这样的:

    interface fruit{  
        public abstract void eat();  
    }  
       
    class Apple implements fruit{  
        public void eat(){  
            System.out.println("Apple");  
        }  
    }  
       
    class Orange implements fruit{  
        public void eat(){  
            System.out.println("Orange");  
        }  
    }  
       
    class Factory{  
        public static fruit getInstance(String ClassName){  
            fruit f=null;  
            try{  
                f=(fruit)Class.forName(ClassName).newInstance();  
            }catch (Exception e) {  
                e.printStackTrace();  
            }  
            return f;  
        }  
    }  
    class hello{  
        public static void main(String[] a){  
            fruit f=Factory.getInstance("Reflect.Apple");  
            if(f!=null){  
                f.eat();  
            }  
        }  
    }  

    在出现新品种水果的时候,你完全不用去修改原有代码。

    相关操作:https://blog.csdn.net/sinat_38259539/article/details/71799078

  • 相关阅读:
    [THUWC2017]在美妙的数学王国中畅游 LCT+泰勒展开+求导
    luoguP4238 【模板】多项式求逆
    Bzoj 2502: 清理雪道 有上下界网络流_最小流
    [十二省联考2019]字符串问题 后缀自动机 + 拓扑排序 + 最长路 + 倍增
    luogu P5290 [十二省联考2019]春节十二响 优先队列 + 启发式合并
    bzoj 2648: SJY摆棋子 KDtree + 替罪羊式重构
    os模块,sys模块
    datetime模块,random模块
    终端打印覆盖打印,让加载界面更加好看
    time模块
  • 原文地址:https://www.cnblogs.com/gggyt/p/8877087.html
Copyright © 2020-2023  润新知