原文地址:https://blog.csdn.net/qq_36666651/article/details/81215221

    isAssignableFrom()方法与instanceof关键字的区别总结为以下两个点:

    • isAssignableFrom()方法是从类继承的角度去判断,instanceof关键字是从实例继承的角度去判断。
    • isAssignableFrom()方法是判断是否为某个类的父类,instanceof关键字是判断是否某个类的子类。


    使用方法:

    1. 父类.class.isAssignableFrom(子类.class)
    2. 子类实例 instanceof 父类类型

    isAssignableFrom()方法的调用者和参数都是Class对象,调用者为父类,参数为本身或者其子类。

    instanceof关键字两个参数,前一个为类的实例,后一个为其本身或者父类的类型。

    我们有时候需要为对象字段设置默认值,即在别的处理中生成对象并对对象进行赋值后,有些值需要有默认值,但是又不方便通过构造方法设置的时候,我们可以通过反射配合注解来为其设置默认值而不用调用一堆set方法。

    下面这个例子即反射配置注解为对象字段设置默认值(包括父类),仅支持String和本类型的包装部分包装类(Number的子类)。

    首先定义注解:

    1. /**
    2. * description:
    3. *
    4. * @author wkGui
    5. */
    6. @Target({ElementType.FIELD})
    7. @Retention(RetentionPolicy.RUNTIME)
    8. @Inherited
    9. @Documented
    10. public @interface ParamDefaultValue {
    11. String value();
    12. }

    定义注解的解析类:

    1. /**
    2. * description:
    3. *
    4. * @author wkGui
    5. */
    6. public class ParamProcessor {
    7. public static void applyDefaultValue(Object o) {
    8. Class sourceClass = o.getClass();
    9. //获取对象所有字段 包括父类
    10. ArrayList<Field> fields = new ArrayList<>();
    11. while (sourceClass != null){
    12. fields.addAll(Arrays.asList(sourceClass.getDeclaredFields()));
    13. sourceClass = sourceClass.getSuperclass();
    14. }
    15. for (Field field : fields) {
    16. field.setAccessible(true);
    17. if (field.isAnnotationPresent(ParamDefaultValue.class)) {
    18. try {
    19. Object val = field.get(o);
    20. if (val != null) {
    21. continue;
    22. }
    23. Class type = field.getType();
    24. if (type.isPrimitive()) {
    25. continue;
    26. }
    27. String defVal = field.getAnnotation(ParamDefaultValue.class).value();
    28. if (String.class.isAssignableFrom(type)) {
    29. field.set(o, defVal);
    30. } else if (Number.class.isAssignableFrom(type)) {
    31. if (Byte.class.isAssignableFrom(type)) {
    32. field.set(o, Byte.valueOf(defVal));
    33. } else if (Float.class.isAssignableFrom(type)) {
    34. field.set(o, Float.valueOf(defVal));
    35. } else if (Short.class.isAssignableFrom(type)) {
    36. field.set(o, Short.valueOf(defVal));
    37. } else if (Integer.class.isAssignableFrom(type)) {
    38. field.set(o, Integer.valueOf(defVal));
    39. } else if (Double.class.isAssignableFrom(type)) {
    40. field.set(o, Double.valueOf(defVal));
    41. } else if (Long.class.isAssignableFrom(type)) {
    42. field.set(o, Long.valueOf(defVal));
    43. }
    44. }
    45. } catch (IllegalAccessException e) {
    46. e.printStackTrace();
    47. }
    48. }
    49. }
    50. }
    51. }