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

原文地址:https://www.cnblogs.com/joshua-aw/p/6020437.html