Java学习解锁新姿势get!

【威哥说】本文里波波老师将带领大家一起学习一下什么是反射,文中暂且没有详细给大家介绍反射如何去获取类中的所有属性和方法,更多的是介绍什么场景下会使用到反射,使用反射有什么好处和缺点,大家有自己的理解也可以相互探讨。

【直播】大家期待已久的直播再次来临,今晚7:30小白老师将继续与大家探讨“如何出色的完成一个APP,以及磨砺营的真实上线的实训项目”。我们不玩虚的,保证大家每一个项目都是真实上线的。最后还有威哥我为大家答疑的时间哟。欢迎大家前来学习。

【正文】反射,一种计算机处理方式。是程序可以访问、检测和修改它本身状态或行为的一种能力。

这是百度百科里的一个说法,我曾经还看到一个对反射的描述为:在运行状态中,对于任意一个class类,都能知道此类的所有属性和方法,对于任意一个对象都能对他的属性和方法进行调用。那在我的理解来看,就是动态的获取一个类的所有属性和方法。这个可以理解为反射的概念,或者说作用。

那么反射的使用在那些场景中呢?应用场景如下:当程序写完之后,如果想添加功能,没法直接创建对象(注意:此处是因为一个完整的程序代码已经成型了,封装好了,你无法直接创建对象),但是一般程序会在定义结构时为了扩展而对外提供接口,所以我们通过实现这个接口,并在使用时告诉程序类名称,然后去通过反射找到class文件,并针对其中的元素进行操作;第二就是为了适应变化,你传入什么类型,我对什么类型进行具体的操作,这类一般用于数据解析。

一般应用:

1、比如java中连接数据库操作时,内部的连接操作已经写好了,如果密码发生变化,我们不需要改变原有的代码逻辑,直接在配置文件中更改即可,这里登录操作就是一个已经封装好的完整的代码块,我不希望后续的更改一些东西时会动到我里面的代码,此时使用反射,很好的解决了这个问题。

2、比如咱们的计算机在设置时会提供对外访问的USB接口,那么连接USB接口的这一块操作计算机内部已经封装好了,不希望外部改动,此时就对外提供了一个访问的接口,你直接连接就行了,这里也使用到反射。

3、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:破坏了类的封装性,可以通过反射获取这个类的私有方法和属性

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 199,830评论 5 468
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 83,992评论 2 376
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 146,875评论 0 331
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,837评论 1 271
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,734评论 5 360
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,091评论 1 277
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,550评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,217评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,368评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,298评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,350评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,027评论 3 315
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,623评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,706评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,940评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,349评论 2 346
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,936评论 2 341

推荐阅读更多精彩内容

  • 【威哥说】本文里波波老师将带领大家一起学习一下什么是反射,文中暂且没有详细给大家介绍反射如何去获取类中的所有属性和...
    磨砺营阅读 218评论 0 0
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,566评论 18 139
  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 31,531评论 18 399
  • 123
    持之恒阅读 174评论 0 0
  • 为什么要说不听老人言,吃苦在眼前呢?其实活到中年,才领悟出来父母那时候说的话确实是有点道理的!父母的人生经历丰富,...
    徐老巫婆阅读 409评论 0 4