package cn.itcast.day1;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
public class ReflectTest {
//Java类中的每一个成员都解析成一个类
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);
System.out.println(cls1.isPrimitive());//是否是原始基本类型,共8个基本的数据类型:boolean\byte\char\short\int\long\float\double
System.out.println(int.class.isPrimitive());
System.out.println(int.class==Integer.class);
System.out.println(int.class==Integer.TYPE);//Integer.TYPE获取基本类型
//在Java中任何类型可以用Class类来表示,任何类型在内存中都是一份字节码
System.out.println(int[].class.isPrimitive());
System.out.println(int[].class.isArray());//判断是否是数组类型
//只要是在源程序出现的类型,都有各自的Class实例对象。
/*
* 编译时,jvm知道你要调用构造方法,但不知道调用何种构造方法,只看变量的定义,不看表达式的执行。
* 运行时,指定调用何种构造方法
*/
Constructor c1=String.class.getConstructor(StringBuffer.class);//选择那个构造方法,根据参数来判断调用那个方法.
//构造方法的作用是new对象
String str2=(String)c1.newInstance(new StringBuffer("abc"));//传入何种值构造对象
System.out.println(str2.charAt(2));
ReflectPoint pt1=new ReflectPoint(3,5);
Field fieldY=pt1.getClass().getField("y");//变量对象,要用它去取某一个对象的值
System.out.println(fieldY.get(pt1));//获得pt1对象的值
/*Field fieldX=pt1.getClass().getField("x");//变量对象,要用它去取某一个对象的值,只获取公有的属性
System.out.println(fieldX.get(pt1));//获得pt1对象的值
*/
Field fieldX1=pt1.getClass().getDeclaredField("x");//变量对象,要用它去取某一个对象的值,只获取公有的属性
fieldX1.setAccessible(true);//暴力反射
System.out.println(fieldX1.get(pt1));//获得pt1对象的值
//作业:将任意一个对象中的所有String类型的成员变量所对应的字符串内容中的“b”改成“a”;
changeStringValue(pt1);
System.out.println(pt1);
}
private static void changeStringValue(Object obj) throws Exception{
Field[] fields=obj.getClass().getFields();
for(Field field:fields){
//if(field.getType().equal(String.class)),
if(field.getType()==String.class){//字节码只有一份
String oldValue=(String)field.get(obj);
String newValue=oldValue.replace('b', 'a');
field.set(obj, newValue);
}
}
}
}
|
|