获取Class对象有三种方式
通过Object.getClass();
Object obj = new Object(); Class clazz = obj.getClass();
任何数据类型(包括基本数据类型)都有一个“静态”的class属性
Class clazz = Object.class;
通过Class类的静态方法:forName(String className)
Class clazz = Class.forName("com.XX.XX.Object");
实例化对象Constructor
获取构造方法
1). 批量方法
public Constructor[] getConstructors()://所有"公有的"构造方法 public Constructor[] getDeclaredConstructors()://获取所有的构造方法(包括私有、受保护、默认、公有)
2). 获取单个构造方法
public Constructor getConstructor(Class... parameterTypes) //获取单个的"公有的"构造方法 public Constructor getDeclaredConstructor(Class... parameterTypes) //获取"某个构造方法"可以是私有的,或受保护、默认、公有
调用构造方法
constructor.newInstance();
//1.加载Class对象 Class clazz = Class.forName("Student"); //2.获取公有、无参的构造方法 Constructor con = clazz.getConstructor(null); //3.调用构造方法 Object obj = con.newInstance(); //4.获取私有构造方法 con = clazz.getDeclaredConstructor(String.class); //5.调用私有构造方法 con.setAccessible(true);//暴力访问(忽略掉访问修饰符) obj = con.newInstance("x");
获取方法Method
1). 批量方法
public Method[] getMethods();// 获取所有"公有方法";(注:包含了父类的方法也包含Object类) public Method[] getDeclaredMethods();// 获取所有的成员方法,包括私有的(注:不包括继承的)
2). 获取指定方法
public Method getMethod(String name,Class<?>... parameterTypes): //获取公共方法,参数:name : 方法名;Class ... : 形参的Class类型对象 public Method getDeclaredMethod(String name,Class<?>... parameterTypes) // 获取私有方法
3). 方法调用
Method.invoke(Object obj,Object... args); //obj : 要调用方法的对象;args:调用方式时所传递的实参;
在调用“私有方法”的之前,必须要加上method.setAccessible(true);来解除私有限定
获取字段
2). 批量方法
public Field[] getFields(): //获取所有的"公有字段";(注:包含了父类的字段也包含Object类) public Field[] getDeclaredFields()// 获取所有的成员字段(注:不包括继承的)
2). 获取指定字段
public Field getField(String fieldName):获取某个"公有的"字段; public Field getDeclaredField(String fieldName):获取某个字段(可以是私有的)
3). 方法调用
field.set(Object obj,Object value) //obj : 要设置的字段的对象;value:要为字段设置的值;
在为“私有字段”赋值的之前,必须要加上 field.setAccessible(true);来解除私有限定 。
代码示范可以参考,https://gitee.com/kaigee/reflect