黑马程序员技术交流社区
标题:
学习反射——》总结
[打印本页]
作者:
xiaoxinxin003
时间:
2015-7-7 00:58
标题:
学习反射——》总结
package classString;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
public class ReflectDemo {
public static void main(String[] args) throws Exception {
String str1 = "abc";
// 一、三种获取字节码的方式
Class cls1 = str1.getClass();
Class cls2 = String.class;
Class cls3 = Class.forName("java.lang.String");
//cls1 cls2 cls3 都是Class的对象,它们应该是相等的
System.out.println(cls1 == cls2);
System.out.println(cls1 == cls3);//都是返回true
//二、判断是否是基本类型方法isPrimitive();以cls1为例
//String类型不是基本类型,返回false,int类型返回true
System.out.println(cls1.isPrimitive());//返回false
System.out.println(int.class.isPrimitive());//返回true
//再看看int类型的数组是不是基本类型
System.out.println(int[].class.isPrimitive());//同样返回了false
System.out.println(int[].class.isArray());//返回true
//三、构造方法的反射应用
/*
* 获取构造方法有两种情况:获取所有和获取单个,下面依次演示
* */
//获取所有
//Constructor [] constructors1 = Class.forName("java.lang.String").getConstructors();
//获取单个(需要传递参数类型以示获取对应的构造方法)
Constructor constructor1 = Class.forName("java.lang.String").getConstructor(StringBuffer.class);
//下面就以获取单个构造方法为例演示实例化以及参数传递
/*
* 创建实例对象的通常方式为
* String str = new String(new StringBuffer("abc"));
* 下面是反射方式的实例对象创建过程以及参数传递
* */
String str2 = (String) constructor1.newInstance(new StringBuffer("abc"));
System.out.println(str2.charAt(2));//索引地址值2并打印
//四、成员变量的反射应用
/*
* 成员变量份公有和私有,引入一个类Field,代表某个类中的某一个成员变量
* 代码演示反射获取成员变量的方法
* */
//公有成员变量获取
ReflectPoint1 pt1 = new ReflectPoint1(3, 5);
//fieldY只是Field的一个对象,指向了“y”,但还没有具体值
Field fieldY = pt1.getClass().getField("y");
//获取y的具体值并打印,需要制定具体对象pt1
System.out.println(fieldY.get(pt1));//5
//第2种、暴力反射(强行获取私有成员变量)
//使私有成员变量可见
Field fieldX = pt1.getClass().getDeclaredField("x");
//使私有成员可取
fieldX.setAccessible(true);
//取值并打印
System.out.println(fieldX.get(pt1));//3
//五、代码演示修改某一类型所有成员的参数
/*
* 步骤:
* 1.首先获取所有字段
* 2.在这些字段中筛选出某一类型(如String)
* 3.修改保存并打印
* */
changeStringValue(pt1);
System.out.println(pt1);//aall****aasketaall******itcast
}
private static void changeStringValue(Object obj)throws Exception {
/*
* 步骤:
* 1.首先获取所有字段
* 2.在这些字段中筛选出某一类型(如String)
* 3.修改保存并打印
* */
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);
}
}
}
}
不足之处,请多指教。
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2