一、通过反射获取对象的方式
1、如果知道一个class的完整类名,可以通过静态方法Class.forName()获取:
Class<?> clazz = Class.forName("com.ahui.pojo.User");
2、如果我们有一个实例变量,可以通过该实例变量提供的getClass()方法获取:
User user = new User();
Class<? extends User> aClass = user.getClass();
3、直接通过一个class的静态变量class获取:
Class<User> userClass = User.class;
二、对象属性的操作
1、获取对象属性的方法:
getDeclaredFields():该方法可以获取到所有的属性包括private修饰的的属性
//获取所有的成员属性
Field[] fields = clazz.getDeclaredFields();
getDeclaredField(String name):该方法通过属性名称获取到属性包括private修饰的的属性
Field usernamme = clazz.getDeclaredField("usernamme");
getFields() : 该方法只能获取public修饰的属性
Field[] fields = clazz.getFields();
getField(String name) :该方法可以通过属性名称获取到属性,对属性进行其他操作
Field username = clazz.getField("username");
对象属性的相关操作
//获取所有的成员属性
Field[] declaredFields = clazz.getDeclaredFields();
for (Field declaredField : declaredFields) {
//获取属性类型
String type = declaredField.getType().toString();
//获取属性名
String name = declaredField.getName();
System.out.println("类型:"+ type);
System.out.println("名称:"+ name);
int modifiers = declaredField.getModifiers();
System.out.println("修饰符:" + modifiers);
}
2、获取对象构造方法:
getDeclaredConstructors():该方法可以获取到所有的构造方法
Constructor<?>[] declaredConstructors = clazz.getDeclaredConstructors()
getDeclaredConstructor(Integer.class, String.class):该方法根据参数类型、个数获取对应的构造方法
Constructor declaredConstructor = clazz.getDeclaredConstructor(Integer.class, String.class);
根据上面获取到的构造方法可以获取到构造方法的所有参数类型:
构造方法名.getParameterTypes();
Class<?>[] parameterTypes = declaredConstructor.getParameterTypes(); for (Class<?> parameterType : parameterTypes) { System.out.println(parameterType); }
3、构造方法实例化对象:
构造方法是private修饰的所有在通过构造方法实例化对象时,需要将构造方法设置允许访问操作
declaredConstructor.setAccessible(true);//将方法设置允许访问操作构造方法名.newInstance(1, "zhangsan"); //用newInstance(参数)实例化对象
Object o = declaredConstructor.newInstance(1, "zhangsan");