黑马程序员-JAVA基础加强之反射

本文介绍了Java反射机制的基本概念及其应用场景,通过实例展示了如何利用反射机制访问类的成员变量,即使在编译期间未知的情况下也能实现代码的动态性。

---------------------- <a href="http://edu.youkuaiyun.com"target="blank">ASP.Net+Android+IOS开发</a>、<a href="http://edu.youkuaiyun.com"target="blank">.Net培训</a>、期待与您交流! ----------------------

Java的反射机制是Java特性之一,反射机制是构建框架技术的基础所在。灵活掌握Java反射机制,对以后学习框架技术有很大的帮助。

大家都知道,要让Java程序能够运行,那么就得让Java类要被Java虚拟机加载。Java类如果不被Java虚拟机加载,是不能正常运行的。现在我们运行的所有的程序都是在编译期的时候就已经知道了你所需要的那个类的已经被加载了。

Java的反射机制是在编译并不确定是哪个类被加载了,而是在程序运行的时候才加载。使用在编译期并不知道的类。这样的特点就是反射。

那么Java反射有什么作用呢?

假如我们有两个程序员,一个程序员在写程序的时候,需要使用第二个程序员所写的类,但第二个程序员并没完成他所写的类。那么第一个程序员的代码能否通过编译呢?这是不能通过编译的。利用Java反射的机制,就可以让第一个程序员在没有得到第二个程序员所写的类的时候,来完成自身代码的编译。

要正确使用Java反射机制就得使用java.lang.Class这个类。它是Java反射机制的起源。当一个类被加载以后,Java虚拟机就会自动产生一个Class对象。通过这个Class对象我们就能获得加载到虚拟机当中这个Class对象对应的方法、成员以及构造方法的声明和定义等信息。

下面举一个简单的例子,假如有A和B两个程序员,程序员A写出了如下类:

public class ReflectString{

public String str1="Congratulations";

public String str2="you are admitted";

public String str3="to heima";

}

程序员B的任务是把ReflectString中所有字符串的字母“a”换成字母“g”,当程序员A完成ReflectString类时,程序员B的任务是轻而易举的。可是,假设程序员A由于某种原因并没有完成ReflectString类的编写,那么程序员B应该如何完成任务呢?

答案是反射!

程序员B的代码如下:

private void changeStringValue(Object obj) throw Exception{

Field[] fields=obj.getClass().getFields();

for(Field field:fields){

if(field.getType()==String.class){

String oldValue=(String)field.get(obj);

String newValue=oldValue.replace('b','a');

field.set(obj,newValue);

}

}

}

虽然程序员A的ReflectString类并没有完成,而且程序员B的代码要修改ReflectString的字段。但程序员B的代码仍可通过编译,这就是反射的好处之一。

---------------------- <a href="http://edu.youkuaiyun.com"target="blank">ASP.Net+Android+IOS开发</a>、<a href="http://edu.youkuaiyun.com"target="blank">.Net培训</a>、期待与您交流! ----------------------

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值