Java反射机制
反射:对类进行剖析
说明:凡带有Declared的方法均返回所有(包含私有)
1. 获取Class
Class clazz = Class.forName(String classname);多用于类加载
Class clazz =obj.getClass();多用于获取对象类型
Class clazz =ClassName.class;多用于传递参数
2. 获得构造函数
Constructor[] constructors = clazz.getConstructors();
Constructor[] constructors = clazz.getDeclaredConstructors();
Constructor constructor = clazz.getConstructor(Class... args); // null表示无参
Constructor constructor = clazz.getDeclaredConstructor(Class... args);
3. 获得类的属性
Field[] fields = clazz.getFields();
Field[] fields = clazz.getDeclaredFields();
Field field = clazz.getField(String fieldname);
Field field = clazz.getDeclaredField(String fieldname);
4. 获得类的方法
Method[] methods = clazz.getMethods();
Method[] methods = clazz.getDeclaredMethods();
Method method = clazz.getMethod(String methodname, Class... args);
Method method = clazz.getDeclaredMethod(String methodname, Class... args);
5. 使用Class
Object obj = clazz.newInstance();调用无参构造函数
clazz: getPackage、getInterfaces、getSuperclass ... isPrimitive(判断是否为基本类型)、isArray(判断是否为数组)
JVM九个预定义的Class对象:八个基本类型.class + void.class
int.class, byte.class, short.class, long.class, float.class, double.class, boolean.class, char.class, void.class
其中:
void.class == Void.TYPE
int.class == Integer.TYPE; int.class != Integer.class;
...
int.class.isPrimitive() == true; int[].class.isArray() == true;
6. 使用Constructor
Object obj = constructor.newInstance(Object... args); // args可为null
7. 使用Field
私有:field.setAccessible(true);
获取:Object value = field.get(Object obj);
设置:field.set(obj, value); // 属性属于对象,若要get或者set某一属性需要传入相应的对象
获取类型:field.getType() == ClassName.class; // 可用于过滤数据
8. 使用Method
私有:method.setAccessible(true);
调用方法:method.invoke(obj, ... args); // args可为null
invoke时,若是静态函数则将obj设为null