您的位置:首页 > 职场人生

黑马程序员_java的反射机制

2012-12-17 23:28 337 查看
反射

(一)、学反射学要的基础知识

1、Class类:
Java中的各个java类属于同一类事物,描述这类事物的java的类名就是Class。
2、对比记忆Class类:
众多的人用Person类来表示,众多的java类用Class类表示。
3、Class类的实例对象理解:
就是对应各个类在内存中的字节码。
4、得到各个类的Class实例对象的3中方法:
方法(一):类名.class,例如:System.class。
方法(二):对象.getClass(),例如:new Date().getClass()。
方法(三):Class.forName(“类的完整名称”),例如:Class.forName(“java.util.Date”)。、
5、9个预定义的Class实例对象:
8大基本数据类型+void。
6、总结:
只要在程序中出现的类型,在内存中都会有相应的一份字节码(即:Class实例对象),例如:int[],void等。
(二)、反射

1、定义:
反射就是把java中的各个成分映射成相应的java类。
例如:一个java类用一个Class类的对象来表示,一个类中的组成部分:成员变量、方法、构造方法、包等信息也用一各个的java类来表示,就想汽车是一个类,汽车中的发动机,变速箱等也是一个个的类。表示java类的Class类显然要提供一系列的方法来获得其中的变量、方法、构造方法、修饰符、包等信息,这些信息就是用相应的类的实例对象来表示,他们是Field、Method、Constructor、Package等等。
2、为什么要学习反射?
答:一个类中的每个成员变量都可以用相应的反射API类的一个实例对象来表示,通过调用Class类的方法可以得到这些实例对象后,得到这些实例对象后有什么用?怎么用?这正式学习和应用的反射的要点。
(三)、Constructor类->构造方法的反射

1、定义:
Constructor类代表某个类中的一个构造方法
2、得到某个类所有的构造方法:
Constructor[] constructors = Class.forName(“java.lang.String”).getConstructors();
3、得到某一个构造方法:
Constructor con = Class.forName(“java.lang.String”).getConstructor(StringBuffer.class)
用其创建实例对象:
(1)通常方法:String str = new String(“ab”);
(2)反射方法:String str = (String)con.newInstance(new StringBuffer(“ab”));
Class.newInstance()方法:
例子:String obj =(String)Class.forName(“java.lang.String”).newInstance();
(四)、Field类->成员变量的反射

1、定义:
Field类代表某个类中的成员变量。
2、重要问题:得到的Field对象是对应到类上面的的成员变量,还是对应到对象上的成员变量?
回答:对应到类上的
3、Field类中的综合应用:
将任意一个对象中所有String类型的成员变量所对应的字符串内容中的"b"改成"a"。
源代码如下:
//(1)ReflectPoint 类的定义:
package cn.itcast.day1;
public class ReflectPoint {
public String str1 = "ball";
public String str2 = "basketball";
public String str3 = "itcast";

@Override
public String toString(){
return "str1:"+str1+",str2:"+str2+",str3:"+str3;
}
}
//(2)操作类中的方法定义:

private static void changeStrringValue(Object obj) throws IllegalArgumentException, IllegalAccessException {
//第一步:得到所有所有的String成员
Field []fields = obj.getClass().getFields();
//第二步:遍历,对每个字符串中的值进行操作
for(Field field : fields){
if(field.getType()== String.class){//这里用==,不用equals,内存中只有一份字节码
//取得每个String类型的属性的值,传对象进去
String oldValue = (String)field.get(obj);
//将字符串中'b'字符变成'a'
String newValue = oldValue.replace('b', 'a');
field.set(obj, newValue);
}
}

}

(五)、Method类->成员方法的反射

1、定义:
Method类代表某个类中的一个成员方法。
2、得到类中的某个方法:
例子:Method charAt= Class.forName(“java.lang.String”).getMethod(“charAt”,int.class);//加上方法名和方法的参数。
(1)调用方法:
A、通常方法:System.out.println(str.charAt(1));
B、反射方法:System.out.println(charAt.invoke(str,1));
注意:
如果传递给Method对象的invoke()方法的一个参数为null,这代表Method对象对应的是一个静态方法。
备注:
str:要被操作的字符串,1:charAt方法中的参数。
5、应用举例:
用反射的方法在类中调用任意类的main方法
源代码如下:
class TestReflect{
public static void main(String [] args){
Test t = new Test();
Method mainMethod = t.getMethod(“main”,String[].class);
//下面的参数要封装下:不然编译器会拆包成几个参数,这是为了兼容jdk1.5而设计的
mainMethod.invoke(null,new Object[]{new String[]{“a”,”b”,”c”}});

}
}

//用来测试Method类的类:
class Test{
public static void main(String [] args){
for(String arg : args){
System.out.println(arg);
}
}
}
课后总结:
反射是java的非常重要的技术,利用反射我们可以实现框架,简化开发的复杂度,实现真正的高效开发。本文出自 “IT-人生精彩” 博客,请务必保留此出处http://mrwlh.blog.51cto.com/2238823/1092662
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: