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 反射机制详解(下)

posted on 2019-05-26 00:44  wanbf  阅读(301)  评论(0编辑  收藏  举报

导航