博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Java 反射机制详解(上)
阅读量:5087 次
发布时间:2019-06-13

本文共 2884 字,大约阅读时间需要 9 分钟。

一、什么是反射

  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方法,我们又不能改变源码,怎么办,反射可以完美解决这个问题。

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

  

转载于:https://www.cnblogs.com/justBobo/p/10922853.html

你可能感兴趣的文章
Python基础
查看>>
洛谷P1352 codevs1380 没有上司的舞会——S.B.S.
查看>>
字符串占位符的使用
查看>>
mina 通讯框架
查看>>
MySQL分区表的管理~1
查看>>
vue表格业务
查看>>
maven 配置说明
查看>>
js接收网页参数
查看>>
Elasticsearch安装
查看>>
linux之查看端口占用
查看>>
[原创]浅谈互联网金融测试平台规划
查看>>
什么是网关及网关作用(转)
查看>>
skymvc网站测试之mysql数据生成
查看>>
静态内存、动态内存与堆栈
查看>>
Asp.Net Core WebApi 和Asp.Net WebApi上传文件
查看>>
如何在应用图标上显示未读消息
查看>>
android脚步---如何看log之程序停止运行,和UI线程和非UI线程之间切换
查看>>
循环结构反思
查看>>
『TensorFlow』SSD源码学习_其一:论文及开源项目文档介绍
查看>>
EasyUI的时间控件禁止输入
查看>>