System.out.println(fieldX.get(pt1));
//下面是反射练习 ,将对象中的所有String类型的成员变量对应的字符串b替换成a
charStringValue(pt1);
//打印改变后的值 需要重写toString方法
System.out.println(pt1);
}
private static void charStringValue(Object obj) throws Exception
{
//将对象中 成员变量赋值给成员变量fields因为是多个所以用数组
Field[] fields = obj.getClass().getFields();
//进行遍历
for(Field field : fields)
{
//如果获得的类型为String类型
if(field.getType() == String.class)
{
String oldValue = (String)field.get(obj);
//这里只是改变了获取后的值
String newValue = oldValue.replace('b', 'a');
//这里改变了对象里面的值
field.set(obj, newValue);
}
}
}
}
class ReflectPoint
{
private int x;
public int y;
public String st1 = "ball";
public String st2 = "basketball";
public String st3 = "itcast";
//这里可以使用eclipse快捷键 ALT+SHIFT+S 快速创建构造方法
public ReflectPoint(int x, int y)
{
super();
this.x = x;
this.y = y;
}
public String toString()
{
return st1 +":" +st2 +":" +st3 +":" ;
}
}
import java.lang.*;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.text.*;
public class ReflectTest
{
/**反射基础:
* 通过通过Class的forName(String className)、类名.class、变量.getClass()获取类的字节码
*
* 通过字节码获得类的构造函数Constructor、方法Method、成员Field等等
* @param args
*/
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");
//他们获得的字节码是相同的
System.out.println(cls1==cls2);
System.out.println(cls2==cls3);;
//下面再介绍几个方法 isPrimitive 判断是否基本类型 ,isArray() 判断是否是数组
System.out.println(cls1.isPrimitive());//String不是基本类型
System.out.println(int.class.isPrimitive());//int是基本类型
System.out.println(int.class == Integer.class);//这两种类型不相同
System.out.println(int.class == Integer.TYPE);//Integer使用TYPE方法转换成int
//下面介绍 构造方法的反射
//举例:完成类似 new String(new StringBuffere("abc"))
//构造方法ConStructor
Constructor constructor1 = String.class.getConstructor(StringBuffer.class);
//使用强制转换 将object强转成String类型
String str2 = (String)constructor1.newInstance(new StringBuffer("abc"));
System.out.println(str2.charAt(2));
//下面介绍成员变量的反射 用下面的ReflectPoint类
//先传递参数
ReflectPoint pt1 = new ReflectPoint(3,5);
//成员变量Field
Field fieldY = pt1.getClass().getField("y");
// filedY的值不是5 他不是对象上的变量,而是类上的,用他去取某个对象上的值
System.out.println(fieldY.get(pt1));
//下面介绍暴力反射 (分为两步),
//第一: 这里x是私有的,要用getDeclaredField
Field fieldX = pt1.getClass().getDeclaredField("x");
//第二:虽然用getDeclaredField 显示了私有的 但是不能用 ,必须用setAccessible设置成可用
fieldX.setAccessible(true);
System.out.println(fieldX.get(pt1));
//下面是反射练习 ,将对象中的所有String类型的成员变量对应的字符串b替换成a
charStringValue(pt1);
//打印改变后的值 需要重写toString方法
System.out.println(pt1);
}
private static void charStringValue(Object obj) throws Exception
{
//将对象中 成员变量赋值给成员变量fields因为是多个所以用数组
Field[] fields = obj.getClass().getFields();
//进行遍历
for(Field field : fields)
{
//如果获得的类型为String类型
if(field.getType() == String.class)
{
String oldValue = (String)field.get(obj);
//这里只是改变了获取后的值
Str