Class类--java类的抽象,是一个特殊的类.
当初理解为每个用class定义的java类,不管是系统定义还是自定义的类,都是Class的实例;现在自我纠正,Class类的实例是各个类在内存中的字节码,张老师讲每个类的字节码是不同的,所以每个类的字节码在内存里存储的内容也是不同的,这些不同的内存空间对应的对象就是Class类的实例(有点像是指向java类的字节码的指针啊).
得到Class对象
三种方法得到Class对象:
1。直接指定字节码对象 Class cls = x.class;
2。通过类的对象调用getClass()方法获得
3. 通过Class.forname(String str)方法指定
Constructor类是对java类的构造方法的抽象,通过反射构造类的实例,
Constructor constr = new String().getClass().getConstructor(x.class...); //x.class是对应构造方法的参数所属的Class对象,可变参数
String str = constr.newInstance(x...); //x是构造方法的参数,不是Class对象,但必须是x.class的一个实例对象,可变参数
用new String().getClass().newInstance()调用无参数的构造方法
Field是对java类的的成员变量的抽象,每个Field对象都是类的属性.
String heima = new String("heima");
Field field = heima.getClass().getField(x);//x是属性名,类型为String
field.get(heima);//heima是所要获得值的属性的所属对象
//field和指向类变量的指针很相似
对私有变量的获取,getField()只能获取可见的变量,对于私有变量则不能获取
Field field = new Object().getClass().getDeclaredField(x);//x是属性名,类型为String;获得指定的类的已声明属性
只是获取field对象还不能取出对应的属性的值
field.setAccessible(true);//设置为可访问,则field所对应的属性不再受private限制(很拽的方法)
field.get(obj);
Method是java类的方法的抽象,每个Method对象都是类的一个方法
Method method = new String().getClass().getMethod(String strName,x.class...);//获取类的指定的方法,getMethod()的参数strName是方法名,String类型,x.class是方法的参数类型,是Class对象,可变参数
method.invoke(obj,x);//调用方法,obj是调用方法的对象,若为静态方法,可为null;x是x.class的实例对象,即方法的参数
和变量一样,当要调用类的私有方法时,采用同样的方式也可
自定义一个类TestPoint
public class TestPoint {
public String name;
public TestPoint(String name) {
super();
this.name = name;
}
private void toString()
{
System.out.println(name);
}
}
通过反射调用toString()方法
TestPoint tp = new TestPoint("这是私有方法调用");
Method tpMethod = tp.getClass().getDeclaredMethod("toString");//因为是无参数的方法,只有一个方法名的参数
tpMethod.setAccessible(true);
tpMethod.invoke(tp);//这里也只有一个参数
反射的基础就是Class类,只有先获得了Class对象才可以进行反射的相关操作.