------ android培训
反射的基石Class类:
java中各个java类属于一类事物,各个java类都有自己的方法、属性、所属的包、类名等。
我们用Class类来描述这一类事物。
Class类的对象就是一个类在内存中所对应的字节码,表示的是一个类
九个预定义Class实例对象
boolean,byte,char,short,long,int,float,double和void :void.class;
反射就是把java类中的各种成分映射成相应的java类。//reflect
import java.lang.*;
class Person
{
Person(){}
public String name;
public int age;
}
class fanshe1
{
public static void main(String[] args) throws Exception
{
Person p=new Person();
p.getClass();//获取对象所在位置的字节码
Class c=Class.forName("Person");
//返回与带有给定字符串名的类或接口相关联的 Class 对象(Class的对象即是类)。
//确定此对象所表示的类或者接口所实现的接口
Class[] d=p.getClass().getInterfaces();
Class[] e=c.getInterfaces();
System.out.println(p.getClass());
System.out.println(c);
System.out.println(Person.class);
String a=c.getName();
//getName()以String的形式放回该Class对象所对应的实体(类、接口、数组类、基本类型和void)名称
String s1=new String();
Class c1=s1.getClass();//获取String类在内存中的字节码;类在内存中以字节码的形式存储
Class c2=String.class;
Class c3=Class.forName("java.lang.String");
sop(c1==c2);
sop(c1==c3);//true :一个类型在类中只有一个字节码
sop(c1.isPrimitive());//是否是基本数据类型 false //String 是一个类
sop(int.class.isPrimitive());//true
sop(int.class==Integer.class);//false,Integer是int的包装类,各有各的字节码
sop(int.class==Integer.TYPE);//true,包装类.Type用于获取包装类的基本类型字节码
sop(int[].class.isPrimitive());//false:只要在源程序中出现的数据类型,都有各自各Class实例对象
sop(int[].class.isArray());//true
//构造方法:用反射实现:String s=new String(new StringBuffer("abc"));
//Constructor con1=String.class.getConstructor(StringBuffer.class);
//String str1=(String)con1.newInstance(new StringBuffer("abc"));//返回的类型是Object,需要强制类型转换(由高到低)
//sop(str1.charAt(2));
//成员变量(字段)Field
fieldTest f=new fieldTest("3",5);
Field field=f.getClass().getField("b");
//Object obj=field.get(f);
Field field2=f.getClass().getDeclaredField("a");//获取声明的字段(包含私有)
field2.setAccessible(true);//声明允许访问私有
sop(field.get(f));
sop(field2.get(f));
//Method str1.charAt(1);
Method me=String.class().getMethod("charAt",int.class);//方法名:哪一个构造方法
System.out.println(me.invoke(str1,1));//"abc" 输出b
replaceTest(f);
}
public static void replaceTest(Object obj)
{
Field[] fie=obj.getClass().getFields();//获取所以字段
for(int i=0;i<fie.length;i++)
{
if(fie[i].getType()==String.class)
{
String oldValue=(String)fie[i].get(obj);
String newValue=oldValue.replace('b','a');
fie[i].set(obj,newValue);
}
}
}
public static void sop(Object obj)
{
System.out.println(obj);
}
}
class fieldTest
{
private String a;
public int b;
public String str1="aabcde";
public String Str2="bbaa";
public fieldTest(String a,int b)
{
this.a=a;
this.b=b;
}
public String toString()
{
return str1+":"+str2;
}
}