public static void main(String[] args)throws Exception{
String str1="abc";
Class cls1=str1.getClass();
Class cls2=String.class;
Class cls3=null;
try {
cls3 = Class.forName("java.lang.String");//必须做异常处理
} catch (ClassNotFoundException e) {
System.out.println(e.toString());
}
System.out.println(cls1 == cls2);//使用的字节码都是同一份,
System.out.println(cls1 == cls3);
//只要是在源程序中出现的类型,都有各自的Class实例对象,如:int[],void...
System.out.println(cls1.isPrimitive());//isPrimitive该方法是String类的方法,用于判断String是否是使用的基本数据的字节码,结果是flase
System.out.println(int.class.isPrimitive());//int 是基本数据字节码
System.out.println(int.class == Integer.class);//Integer 是一个类,而不是基本数据类型
System.out.println(int.class == Integer.TYPE);//Integer类专门定义了一个常量TYPE,
System.out.println(int[].class.isPrimitive());//数组是一种类型
System.out.println(int[].class.isArray());//判断一个Class是不是数组
/*
* 什么叫反射?
* 反射是把Java类中的各种成份,映射成相应的java类
* 例如:
*  一个Java类用一个Class类的对象来表示,一个类中的组成部分:成员变量,方法,构造方法,包等等信息用一个个java类来表示。
*/
//公有有属性的访问
Student st=new Student("a",5);
Field fd1=st.getClass().getField("age");
System.out.println(fd1.get(st));
//私有属性的访问,使用setAccessible 方法,该方法可以强行调用
Field fd2=st.getClass().getDeclaredField("name");
fd2.setAccessible(true);//暴力反射,
System.out.println(fd2.get(st));
//访问方法
Method metchar=Student.class.getMethod("show",int.class,int.class);
System.out.println(metchar.invoke(st,1,2));//invoke方法指定要调用哪个对象的方法,传入传输
changeStringvalue(st);
System.out.print(st);
//获取某个 类中所有的方法列表
Class classType1=Student.class;//使用每个类内置的class方法获取
//Class classType=Class.forName("FanSheDemo.Student");//指定包名。类名
Method[] met=classType1.getDeclaredMethods();
for(Method m:met){
System.out.println(m);
}
}
//修改成员变量的值
private static void changeStringvalue(Object o){
Field[] fd=o.getClass().getFields();
for(Field f:fd){
if(f.getType()==String.class){
try {
String aldValue=(String)f.get(o);
String newValue=aldValue.replace('a', '1');
f.set(o,newValue);
} catch (IllegalArgumentException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
}
}
}
}
}