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反射的小伙伴一定要去看看哦。

java反射的优缺点_浅谈Java反射的优缺点相关推荐

  1. java 中的单元测试_浅谈Java 中的单元测试

    单元测试编写 Junit 单元测试框架 对于Java语言而言,其单元测试框架,有Junit和TestNG这两种, 下面是一个典型的JUnit测试类的结构 package com.example.dem ...

  2. java编程double相乘_浅谈Java double 相乘的结果偏差小问题

    看下面的一段代码的运行结果: public class TestDouble { public static void main(String[] args) { double d =538.8; S ...

  3. java布尔类型比较器_浅谈Java中几种常见的比较器的实现方法

    在java中经常会涉及到对象数组的排序问题,那么就涉及到对象之间的比较问题. 通常对象之间的比较可以从两个方面去看: 第一个方面:对象的地址是否一样,也就是是否引用自同一个对象.这种方式可以直接使用& ...

  4. java null什么意思_浅谈java中null是什么,以及使用中要注意的事项

    1.null既不是对象也不是一种类型,它仅是一种特殊的值,你可以将其赋予任何引用类型,你也可以将null转化成任何类型,例如: Integer i=null; Float f=null; String ...

  5. java定义byte数组_浅谈java的byte数组的不同写法

    (由于篇幅原因阐述的不够详细科学,不喜勿喷). 经常看到java中对byte数组的不同定义,粗略整理的一下: 一个字节(byte)=8位(bit),"byte数组"里面全部是&qu ...

  6. java 中的排序_浅谈java中常见的排序

    浅谈java中常见的排序 学过java的人都知道,排序这一部分初次接触感觉还是有点难以理解,很多地方也会用到.然而,在java中常见的排序方法:冒泡排序,选择排序,插入排序等等.下面就让我们一起揭开他 ...

  7. java 对象之间转换_浅谈java对象之间相互转化的多种方式

    浅谈java对象之间相互转化的多种方式,对象,属性,参数,赋值,不支持 浅谈java对象之间相互转化的多种方式 易采站长站,站长之家为您整理了浅谈java对象之间相互转化的多种方式的相关内容. 第一种 ...

  8. java变量命名规则_浅谈JAVA开发规范与开发细节(上)

    开发团队在开发过程中,由于每个人的开发习惯,以及对于技术的理解深浅程度不一,往往一个项目在开发过程中,代码的质量,代码的风格都不尽相似,所以有一份适合团队的代码规范是非常有必要的,而一个团队的代码规范 ...

  9. java继承和引用_浅谈Java继承、传递

    一.继承 1. 继承的概念: 子类继承父类,表明子类是一种特殊的父类,并且具有父类所不具有的一些属性或方法. 2. 继承中的初始化顺序: 从类的结构上而言,其内部可以有如下四种常见形态:属性(包括类属 ...

  10. java string的作用_浅谈java String不可变的好处

    一.java内部String类的实现: java 8: public final class String implements java.io.Serializable, Comparable, C ...

最新文章

  1. 成为顶尖算法专家需要知道哪些算法?
  2. NumPy-快速处理数据
  3. Oracle技术之OCRCONFIG工具
  4. BlockJUnit4ClassRunner
  5. android fragment界面滑动切换效果,Android App中使用ViewPager+Fragment实现滑动切换效果...
  6. Linux进程全解12——lIPC机制之管道,SystemV IPC介绍
  7. 运维编排场景系列----给实例加到SLS机器组
  8. 【Clickhouse】Clickhouse 外部存储引擎之 hdfs
  9. TCP/IP网络编程(2)
  10. VS2010与.NET4系列 10. VS2010代码智能感知增强
  11. python画航线图_Python获取航线信息并且制作成图的讲解
  12. AltiumDesigner20绘制51单片机最小系统原理图详细流程
  13. dbfs和dbm的换算_「清晰易懂」dBFS、dBm、dBV、dBW、0dB、-3dB概念解析
  14. [音频处理]傅里叶变换去噪
  15. C语言鸡兔同笼应用题100道,C语言应用题。
  16. Air202学习 四 (模块mqtt通信控制继电器)
  17. linux网易云打不开的问题
  18. stm32h7xx_hal_conf.h讲解
  19. Flux架构思想在度咔App中的实践
  20. ExpandableListview的简单使用

热门文章

  1. DrawIO 基于MinIO以及OSS私有云方案
  2. UE4骨骼动画新手入门
  3. Jpeg怎么变成jpg格式?教你三步快速转换格式
  4. BigDATA面试题
  5. c 语言条件运算符,C 语言条件运算符详细讲解
  6. 《java程序设计基础》使用Reader和Writer流类
  7. word两种html区别,word文本框有哪两种方式?
  8. JavaMail学习6 发送邮件
  9. vue根据文件名后缀区分
  10. 基于matlab特征脸Eigenface算法的实现