反射的基石————Class类
得到各个字节码对应的实例对象
1、类名.class
2、对象.getClass()
3、Class.forName(“类名”)
class Demo
{
public static void main(String[] args) throw Exception
{
String s1="abd";
Class cls1=s1.getClass();
Class cls2=String.class;
Class cls3=Class.forName("java.lang.String");
//注意:三种方法都是同一份字节码
}
}
反射————把java类中的各种成分映射成相应的java类
Constructor类
得到某个类所有的构造方法
————Constructor[] constructor = Class.forName("java.lang.String"),getConstrutors
创建实例对象
————通常方法:String str=new String(new StringBuffer("abc"));
————反射方法:String str=(String)constructor.newInstance(new StringBuffer("abc"));
调用获得的方法时要用到上面相同类型的实例对象
Field类————代表某一个类中的一个成员变量
Constructor constructor1 = String.class.getConstructor(StringBuffer.class);
String str2=(String)constructor1.newInstance(new StringBuffer("abc"));
System.out.println(str2.charAt(2));
public class ReflectPoint//建立反射点
{
private int x;
public int y;
public String str1="ball";
public String str2="basketball";
public String str2="itcast";
public void Reflectpoint(int x, int y)
{
super();
this.x=x;
this.y=y;
}
public String toString(){
return str1+":"+str2+":"+str3;
}
}
ReflectPoint pt1=new ReflectPoint(3,5);//赋值
Field fieldY = pt1.getClass().getField("y");//y在pt1中的字节码,y为一个变量
fieldY.get(pt1)//y对应在pt1对象中的值
Field fieldX = pt1.getClass().getDeclaredField("x");//因为x为私有的不能getField
fieldX.setAccessible(true);//暴力反射
fieldX.get(pt1);
//把字符串中的“b‘转换成”a“
private static void changeStringValue(Object obj)throw Exception
{
Field[] field = obj.getClass().getField();
for(Field field : fields)
{
// if(field.getType().equals(String.class))
if(field.getType() == String.class)//同一份字节码
{
String oldValue=(String)field.get(obj);
String newValue=oldValue.replace('b','a');
field.set(obj,newValue);
}
}
}