zoukankan      html  css  js  c++  java
  • Java 反射机制详解(上)

    一、什么是反射

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

    二、为什么要用反射

      我们为什么要涌反射,反射的作用是什么,在实际开发中有什么应用

      我们先了解编译的两个概念:

      静态编译:在编译时确定类型,绑定对象,即通过

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

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

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

      我们用工厂模式代码示例:

    public interface Shape{
      void draw();
    }
    
    class Rectangle  implements Shape{
       @Override
      public void draw(){
        System.out.println("Inside Rectangle::draw() method.");
       }}
    
    class Square implements Shape{
       @Override
      public void draw(){
        System.out.println("Inside Square::draw() method.");
       }}
    
    class Circle implements Shape{
       @Override
      public void draw(){
        System.out.println("Inside Circle::draw() method.");
       }}
    //构造工厂 class ShapeFactory{     //使用 getShape 方法获取形状类型的对象     public static Shape getShape(String shapeType){     if(shapeType == null){       return null; }if(shapeType.equalsIgnoreCase("CIRCLE")){       return new Circle(); }elseif(shapeType.equalsIgnoreCase("RECTANGLE")){       return new Rectangle(); }elseif(shapeType.equalsIgnoreCase("SQUARE")){       return new Square(); }     return null; }} class FactoryPattern Demo{     public static void main(String[]args){ 
        Shape s= ShapeFactory.getShape("CIRCLE");
         s.draw();

        }
      }
    }

      根据示例可以看出,每当我们添加一个产品的同时,需要增加一个产品类,还需要修改工厂源码ShapeFactory,而往往修改源码是非常危险的,

      随着产品的增加 ShapeFactory 类会越来越臃肿;

      而利用反射有效降低类的耦合性,降低维护成本,请看代码:

    public interface Shape{
      void draw();
    }
    
    class Rectangle  implements Shape{
       @Override
      public void draw(){
        System.out.println("Inside Rectangle::draw() method.");
       }}
    
    class Square implements Shape{
       @Override
      public void draw(){
        System.out.println("Inside Square::draw() method.");
       }}
    
    class Circle implements Shape{
       @Override
      public void draw(){
        System.out.println("Inside Circle::draw() method.");
       }}
    
    //构造工厂
    class ShapeFactory{
        //使用 getShape 方法获取形状类型的对象
        public static Shape getShape(String shapeType){
          Shape s = null;
              try{  
                s=(Shape)Class.forName(shapeType).newInstance();  
              }catch (Exception e) {  
                e.printStackTrace();  
              }  
                return s; 
       }}
    
    class FactoryPattern Demo{
        public static void main(String[]args){ 
         Shape f=ShapeFactory.getShape("Reflect.Rectangle");  //这里的产品类路径,实际项目多在配置文件中配置
            if(f!=null){  
              f.draw();  
             }  
       }}
    

      上面示例的代码,当增加产品时,是不用去修改工厂类ShapeFactory;可以很清楚体验到反射的灵活性和优越性。

       举一个看到过的例子,在实际开发中,我们需要把一个包中的class new出来,但是这个包中的类总是需要变动,那么怎么办 ,难道总是修改main方法中xxx=new xxx()吗。这样无疑是麻烦的。而运用反射。我们可以相应的增加一个配置文件,在里面记录包中所有的类名,包中类增加时就加一个类名,删除时就删除一个类名。让main方法去读取这个配置文件中的类名,通过反射获得实例,完全不用我们去修改main方法中的代码。

      反射还有什么用那?他甚至可以修改其他类中的私有属性。android开发中,我们需要改变一个私有标志位的时候,android源码并没有提供set方法,我们又不能改变源码,怎么办,反射可以完美解决这个问题。

      说了这么多,那么我们的开发中,为什么不全部都用反射呢?一个原因,开销,它的开销是昂贵的,尽量在最需要的地方使用反射。

      Java 反射机制详解(下)

  • 相关阅读:
    面向机器学习的特征工程
    卷积可视化,图像理解,deepdream,风格迁移
    损失函数
    开源是如何支撑区块链技术发展的
    揭秘机密计算:弥补最后一个入侵 “漏洞”
    什么是超大规模数据中心?
    比特币是避险资产还是储备资产?
    区块链技术生态持续优化,五大趋势不容忽视
    物联网低功耗广域网(LPWAN)的比较
    碎片化是物联网快速发展的阻碍,也是机会
  • 原文地址:https://www.cnblogs.com/justBobo/p/10922853.html
Copyright © 2011-2022 走看看