[TOC]

区别

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

isAssignableFrom()方法是从类继承的角度去判断,instanceof关键字是从实例继承的角度去判断。

isAssignableFrom()方法是判断是否为某个类的父类,instanceof关键字是判断是否某个类的子类。

使用方法:

1
2
3
父类.class.isAssignableFrom(子类.class)

子类实例 instanceof 父类类型

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

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

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

用法

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

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

首先定义注解:

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

定义注解的解析类:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
/**
* description:
*
* @author wkGui
*/
public class ParamProcessor {
public static void applyDefaultValue(Object o) {
Class sourceClass = o.getClass();
//获取对象所有字段 包括父类
ArrayList<Field> fields = new ArrayList<>();
while (sourceClass != null){
fields.addAll(Arrays.asList(sourceClass.getDeclaredFields()));
sourceClass = sourceClass.getSuperclass();
}

for (Field field : fields) {
field.setAccessible(true);
if (field.isAnnotationPresent(ParamDefaultValue.class)) {
try {
Object val = field.get(o);
if (val != null) {
continue;
}
Class type = field.getType();
if (type.isPrimitive()) {
continue;
}
String defVal = field.getAnnotation(ParamDefaultValue.class).value();

if (String.class.isAssignableFrom(type)) {
field.set(o, defVal);
} else if (Number.class.isAssignableFrom(type)) {
if (Byte.class.isAssignableFrom(type)) {
field.set(o, Byte.valueOf(defVal));
} else if (Float.class.isAssignableFrom(type)) {
field.set(o, Float.valueOf(defVal));
} else if (Short.class.isAssignableFrom(type)) {
field.set(o, Short.valueOf(defVal));
} else if (Integer.class.isAssignableFrom(type)) {
field.set(o, Integer.valueOf(defVal));
} else if (Double.class.isAssignableFrom(type)) {
field.set(o, Double.valueOf(defVal));
} else if (Long.class.isAssignableFrom(type)) {
field.set(o, Long.valueOf(defVal));
}
}

} catch (IllegalAccessException e) {
e.printStackTrace();
}
}
}
}
}