-----------android培训、java培训、java学习型技术博客、期待与您交流! ------------
反射的基石——Class类
Class代表什么事物?
Java程序中的各个Java类属于同一类事物,描述这类事物的Java类名就是Class。
Class cls2=Date.Class
Classs.forName("……");
八个基本类和void都有对应的Class对象。
例:String str1="abc";
Class cls1=str1.getClass();
Class cls2=String.Class();
Class cls3=Class.forName("java.lang.string");
System.out.println(cls1==cls2); true
System.out.println(cls2==cls3); true
Class.isprimitive()该类是否是原始类型。
cls1.isprimitive() String不是基本类型 false
int.Class.isprimitive() true
int.Class==Integer.Class false
int.Class==Integer.TYPE true
数组类型的Class对象:Class.isArray()
int[].Class.isArray() true
总之,只要在原程序中出现的类型,都有各自的Class实例对象。例如:int[],void.
反射就是把Java类中的各种成分映射成相应的java类。
问题:将任意一个对象中的所有String类型的成员变量所对应的字符串内容的"b"改成"a"。
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);
System.out.println(obj);
}
}
用反射方式执行某个类中的main方法。
普通类名.main(参数)即可完成,为什么用反射?因为具体哪个类不确定。
数组的反射:数组的类型和维度相同,则其Class也相同。
例:int[] a1=new int[3];
int[] a2=new int[4];
int[][] a3=new int[2][3];
String[] a4=new String[3];
a1.getClass()==a2.getClass(); true
a1.getClass()==a3.getClass(); false
a1.getClass()==a4.getClass(); false
数组名[下标].getClass().getName() 只可以获得某个数组元素的类型。
反射的作用:实现框架功能。
-----------android培训、java培训、java学习型技术博客、期待与您交流! ------------