java基础-反射浅析(磨砺营马剑威java)

【威哥说】本文里波波老师将带领你们一块儿学习一下什么是反射,文中暂且没有详细给你们介绍反射如何去获取类中的全部属性和方法,更多的是介绍什么场景下会使用到反射,使用反射有什么好处和缺点,你们有本身的理解也能够相互探讨。 反射,一种计算机处理方式。是程序能够访问、检测和修改它自己状态或行为的一种能力。 这是百度百科里的一个说法,我曾经还看到一个对反射的描述为:在运行状态中,对于任意一个class类,都能知道此类的全部属性和方法,对于任意一个对象都能对他的属性和方法进行调用。那在个人理解来看,就是动态的获取一个类的全部属性和方法。这个能够理解为反射的概念,或者说做用。java

那么反射的使用在那些场景中呢?应用场景以下:当程序写完以后,若是想添加功能,无法直接建立对象(注意:此处是由于一个完整的程序代码已经成型了,封装好了,你没法直接建立对象),可是通常程序会在定义结构时为了扩展而对外提供接口,因此咱们经过实现这个接口,并在使用时告诉程序类名称,而后去经过反射找到class文件,并针对其中的元素进行操做;第二就是为了适应变化,你传入什么类型,我对什么类型进行具体的操做,这类通常用于数据解析。 通常应用: 一、好比java中链接数据库操做时,内部的链接操做已经写好了,若是密码发生变化,咱们不须要改变原有的代码逻辑,直接在配置文件中更改便可,这里登陆操做就是一个已经封装好的完整的代码块,我不但愿后续的更改一些东西时会动到我里面的代码,此时使用反射,很好的解决了这个问题。 二、好比我们的计算机在设置时会提供对外访问的USB接口,那么链接USB接口的这一块操做计算机内部已经封装好了,不但愿外部改动,此时就对外提供了一个访问的接口,你直接链接就好了,这里也使用到反射。 三、Android中请求网络数据时,要解析成什么对象,传入一个对应的class类型,直接根据类型解析数据...... 可能不少初学者,甚至说开发已经有一年经验的开发者都有些没搞懂反射的概念,还有可能有些开发者一直知道这么去用,可是知其然不知其因此然。那今天讲一个简单的示例来给你们引伸出这个概念。 就拿USB接口这个来讲,咱们会在封装时直接定义一个父类接口 USB,注意:这里是对外提供的扩展的接口,以下: public interface PCI {数据库

public void open();安全

public void close();微信

} 而后咱们须要去定义计算机内部的驱动程序,这里个人驱动程序是一个体系不但愿外部来操做,因此电脑内部的驱动代码你们是没法调用的,可是具体实现是如何来实现的呢?咱们简单模拟一下: 首先主板的驱动类: public class Mainboard {网络

public void run() {性能

System.out.println("main board run....");学习

}对象

public void useUSB(USB u) {接口

if (u != null) {开发

u.open();

u.close();

}

}

}

正常状况下,每添加一个USB接口,咱们都得从新new一个对象,而后放进去进行使用,以下: //使用一个鼠标的USB

Mainboard mb = new Mainboard();

mb.run();

//每次添加一个设备都须要修改代码传递一个新建立的对象

mb.useUSB(new MouseUSB());

//使用一个键盘的USB

这里又须要修改代码

mb.useUSB(new KeyBoardUSB());

那若是说像电脑同样直接把内部封装好了,不直接让你去修改代码可如何是好? 此时咱们就须要反射的知识了,咱们经过接入的USB直接告诉电脑一个类型,也就是说我是什么类型的,不动你本来的东西,我在外部稍微改动一下便可,那在代码中该如何体现呢?在java中咱们可使用配置文件的方式来解决这类问题。 好比咱们新建一个usb.properties

在其中保留usb1=MouseUSB.class

在主板中直接定义好处理逻辑,读取properties文件,并执行全部USB接口:

File configFile = new File("usb.properties");

Properties prop = new Properties();

FileInputStream fis = new FileInputStream(configFile);

prop.load(fis);

for(int x=0; x

String usbName = prop.getProperty("usb"+(x+1));

//经过类名获得类对象

Class clazz = Class.forName(usbName);//用Class去加载这个usb子类。

//经过类对象的newInstance()方法调用空参的构造方法建立实例

USB u = (USB)clazz.newInstance();

mb.usePCI(u);

}

fis.close();

有了这么一个定义以后,咱们若是有了后续要添加的USB接口,咱们只须要在配置文件中添加定义便可,如:usb2=KeyBoardUSB.class,就不用去改变原有的逻辑了。 优势: A:可以运行时动态获取类的实例,大大提升系统的灵活性和扩展性。 B:与Java动态编译相结合,能够实现无比强大的功能 缺点: A:使用反射的性能较低 B:使用反射相对来讲不安全 C:破坏了类的封装性,能够经过反射获取这个类的私有方法和属性 更多内容关注微信公众号mjw-java或访问www.moliying.com

相关文章
相关标签/搜索