java反射的优缺点_浅谈Java反射的优缺点
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反射的优缺点相关推荐
- java 中的单元测试_浅谈Java 中的单元测试
单元测试编写 Junit 单元测试框架 对于Java语言而言,其单元测试框架,有Junit和TestNG这两种, 下面是一个典型的JUnit测试类的结构 package com.example.dem ...
- java编程double相乘_浅谈Java double 相乘的结果偏差小问题
看下面的一段代码的运行结果: public class TestDouble { public static void main(String[] args) { double d =538.8; S ...
- java布尔类型比较器_浅谈Java中几种常见的比较器的实现方法
在java中经常会涉及到对象数组的排序问题,那么就涉及到对象之间的比较问题. 通常对象之间的比较可以从两个方面去看: 第一个方面:对象的地址是否一样,也就是是否引用自同一个对象.这种方式可以直接使用& ...
- java null什么意思_浅谈java中null是什么,以及使用中要注意的事项
1.null既不是对象也不是一种类型,它仅是一种特殊的值,你可以将其赋予任何引用类型,你也可以将null转化成任何类型,例如: Integer i=null; Float f=null; String ...
- java定义byte数组_浅谈java的byte数组的不同写法
(由于篇幅原因阐述的不够详细科学,不喜勿喷). 经常看到java中对byte数组的不同定义,粗略整理的一下: 一个字节(byte)=8位(bit),"byte数组"里面全部是&qu ...
- java 中的排序_浅谈java中常见的排序
浅谈java中常见的排序 学过java的人都知道,排序这一部分初次接触感觉还是有点难以理解,很多地方也会用到.然而,在java中常见的排序方法:冒泡排序,选择排序,插入排序等等.下面就让我们一起揭开他 ...
- java 对象之间转换_浅谈java对象之间相互转化的多种方式
浅谈java对象之间相互转化的多种方式,对象,属性,参数,赋值,不支持 浅谈java对象之间相互转化的多种方式 易采站长站,站长之家为您整理了浅谈java对象之间相互转化的多种方式的相关内容. 第一种 ...
- java变量命名规则_浅谈JAVA开发规范与开发细节(上)
开发团队在开发过程中,由于每个人的开发习惯,以及对于技术的理解深浅程度不一,往往一个项目在开发过程中,代码的质量,代码的风格都不尽相似,所以有一份适合团队的代码规范是非常有必要的,而一个团队的代码规范 ...
- java继承和引用_浅谈Java继承、传递
一.继承 1. 继承的概念: 子类继承父类,表明子类是一种特殊的父类,并且具有父类所不具有的一些属性或方法. 2. 继承中的初始化顺序: 从类的结构上而言,其内部可以有如下四种常见形态:属性(包括类属 ...
- java string的作用_浅谈java String不可变的好处
一.java内部String类的实现: java 8: public final class String implements java.io.Serializable, Comparable, C ...
最新文章
- 成为顶尖算法专家需要知道哪些算法?
- NumPy-快速处理数据
- Oracle技术之OCRCONFIG工具
- BlockJUnit4ClassRunner
- android fragment界面滑动切换效果,Android App中使用ViewPager+Fragment实现滑动切换效果...
- Linux进程全解12——lIPC机制之管道,SystemV IPC介绍
- 运维编排场景系列----给实例加到SLS机器组
- 【Clickhouse】Clickhouse 外部存储引擎之 hdfs
- TCP/IP网络编程(2)
- VS2010与.NET4系列 10. VS2010代码智能感知增强
- python画航线图_Python获取航线信息并且制作成图的讲解
- AltiumDesigner20绘制51单片机最小系统原理图详细流程
- dbfs和dbm的换算_「清晰易懂」dBFS、dBm、dBV、dBW、0dB、-3dB概念解析
- [音频处理]傅里叶变换去噪
- C语言鸡兔同笼应用题100道,C语言应用题。
- Air202学习 四 (模块mqtt通信控制继电器)
- linux网易云打不开的问题
- stm32h7xx_hal_conf.h讲解
- Flux架构思想在度咔App中的实践
- ExpandableListview的简单使用