反射
对类的剖析
成员变量,方法,构造方法
1.获取class的字节码对象,其类型是 Class
1.getClass
2.类名直接调用 类名.class直接获取;
3.Class clazz = Class.forName("包名.类名");//括号里写全路径名
2.获取成员变量
Field[] fields = clazz.getFields();//只能访问public修饰的变量;全部的public
Field f = clazz.getField("name");//具体的一个
3.暴力反射
Field[] fs = clazz.getDeclaredFields();//可以拿到所有权限的属性
Field f = clazz.getDeclareField("name");//具体的一个
4.获取构造方法
Constructor[] construtoc = clazz.getConstructors();//只能获取public修饰的
Constructor[] construtoc = clazz.getDeclaredCostructors();//能获取全部的构造方法
获取一个
Constructor c= clazz.getDeclaredConstructors(int.class);获取构造方法的名称
Object obj = c.newInstance(int x);创建class的对象了
Person p = (Person)obj;//强转回来,因为Object中没有getX()方法
p.getX();
Person p = (Person)clazz.newInstance();//走无参默认的构造方法
5.获取成员方法
Method[] methods = clazz.getMethods();//获取所有的public修饰的方法(包括父类的)
Method m = clazz.getMethod("方法名",参数类型(String.Class));//获取一个方法
Method[] methods = clazz.getDeclaredMethods();//获取全部的方法(仅仅是自己的,不包括父类的)
使用方法:
m.invoke(clazz.newInstance(),"函数的实参");//(第一个是对象,后面的是实际参数)