首页 > hot资讯 > 浅谈Java反射的优缺点

浅谈Java反射的优缺点

更新时间:2020-11-23 17:51 浏览115次 来源:动力节点

Java反射是一种能够在程序运行时动态访问、修改某个类中任意属性(状态)和方法(行为)的机制(包括private实例和方法),java反射机制提供了以下几个功能:在运行时判断任意一个对象所属的类;在运行时构造任意一个类的对象;在运行时判断任意一个类所具有的成员变量和方法;在运行时调用任意一个对象的方法。根据这些功能,本我们我们就来谈一谈Java反射的优缺点


一、Java反射的优点

1.增加程序的灵活性,避免将程序写死到代码里。

例:定义了一个接口,实现这个接口的类有20个,程序里用到了这个实现类的地方有好多地方,如果不使用配置文件手写的话,代码的改动量很大,因为每个地方都要改而且不容易定位,如果你在编写之前先将接口与实现类的写在配置文件里,下次只需改配置文件,利用反射(java API已经封装好了,直接用就可以用 Class.newInstance())就可完成。

 

2.代码简洁,提高代码的复用率,外部调用方便

 

package cn.yonyong.reflection.testdemo;

 

interface Fruit { //水果接口

  public void eat() ; //吃水果

}

 

class Apple implements Fruit{ //定义苹果

  public void eat() {

    System.out.println("**吃苹果。");

  }

}

 

class Orange implements Fruit{

  public void eat() {

    System.out.println("**吃橘子。");

  }

}

 

class Factory{

  public static Fruit getInstance(String className){

    Fruit fruit = null ;

    try{

      fruit = (Fruit) Class.forName(className).newInstance() ;

    }catch(Exception e ){

      e.printStackTrace() ;

    }

    return fruit ;

  }

}

 

public class FactoryDemo{

  public static void main(String args[]){

  //通过工厂类取得接口实例,传入完整的包.类名称

    Fruit f = Factory.getInstance("cn.yonyong.reflection.testdemo.Apple") ;

    if(f!=null){ //判断是否取得接口实例

      f.eat() ;

    }

  }

}

如果不用反射,那么我们如果再加一个西瓜类,就得在Factory里判断,每添加一个类都要修改一次Factory,但用了反射只用在调用的时候传入完整的类名就可完成。结果:用反射,修改一处代码;不用反射,修改两处代码。

 

3.对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法

 

二、Java反射的缺点

1.性能问题

使用反射基本上是一种解释操作,用于字段和方法接入时要远慢于直接代码。因此Java反射机制主要应用在对灵活性和扩展性要求很高的系统框架上,普通程序不建议使用。

反射包括了一些动态类型,所以JVM无法对这些代码进行优化。因此,反射操作的效率要比那些非反射操作低得多。我们应该避免在经常被 执行的代码或对性能要求很高的程序中使用反射。


2.使用反射会模糊程序内部逻辑

程序人员希望在源代码中看到程序的逻辑,反射等绕过了源代码的技术,因而会带来维护问题。反射代码比相应的直接代码更复杂。


3.安全限制

使用反射技术要求程序必须在一个没有安全限制的环境中运行。如果一个程序必须在有安全限制的环境中运行,如Applet,那么这就是个问题了。


4.内部暴露

由于反射允许代码执行一些在正常情况下不被允许的操作(比如访问私有的属性和方法),所以使用反射可能会导致意料之外的副作用--代码有功能上的错误,降低可移植性。反射代码破坏了抽象性,因此当平台发生改变的时候,代码的行为就有可能也随着变化。


所以,总的来说,Java反射机制实际上是一把双刃剑,我们只有熟练掌握Java反射的优缺点,才能妥善使用Java反射这一利器,为我们的编程扫清障碍而不至于影响到我们的程序本身。其实,本站的Java基础教程对Java的反射机制讲解的十分透彻,本文也只是借鉴了一部分内容,想深入学习Java反射的小伙伴一定要去看看哦。

 


热门课程推荐

全部班型支持免费试学

动力节点在线报名表(此信息已加密,请放心填写)

返回顶部