zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    H3CNE学习2,3 TCP-IP模型
    H3CNE学习1 课程简介
    TCPDUMP抓包学习
    Kubernetes 学习26 基于kubernetes的Paas概述
    Kubernetes 学习25 创建自定义chart及部署efk日志系统
    Linux https认证原理
    Kubernetes 学习24 helm入门
    【MySQL基础总结】索引的使用
    【MySQL基础总结】常用函数库
    【MySQL基础总结】运算符的使用
  • 原文地址:https://www.cnblogs.com/gggyt/p/8877087.html
Copyright © 2011-2022 走看看