反射的基本概念和API就不多做赘述了,网上有很多介绍,直接切入正题
第一个工具:通过反射获取对象属性值
public static <T> Object getFieldValue(T type,String name){
Field field=null;
Object result = null;
try {
field = type.getClass().getDeclaredField(name);//不推荐,破坏了对象的安全性
field.setAccessible(true);
try {
result = field.get(type);//此处也可以通过get方法来取值,而且相对安全
} catch (IllegalArgumentException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
}
} catch (NoSuchFieldException e) {
e.printStackTrace();
} catch (SecurityException e) {
e.printStackTrace();
}
return result;
}
Test
QpsModel model = new QpsModel();
model.setUrl("url");
String fieldValue = getFieldValue(model, "url").toString();//等效于model.getUrl();
System.out.println(fieldValue);
输出“url”,理想的结果。
是不是有种map.get(key)的感觉呢
第二个工具:根据指定值获取枚举
首先创建方法
public static <T> T getEnumByKey(Class<T> enumClass,String enumField,Object value) {
for(Object obj : enumClass.getEnumConstants()){
if(getFieldValue(obj, enumField).equals(value)) {
return (T) obj;
}
}
return null;
}
再添加一个测试用的枚举
enum DomainEnum{
INTERNAL(1,"internal"),
EXTERNAL(2,"external");
public final int id;
public final String name;
private DomainEnum(int id,String name) {
this.id = id;
this.name = name;
}
public DomainEnum getEnumByName(String name){
for(DomainEnum type : DomainEnum.values()){
if(type.name.equals(name)){
return type;
}
}
return null;
}
}
Test
DomainEnum enumValue = getEnumByKey(DomainEnum.class, "name", "external");
System.out.println(enumValue.id);
输出2
不难发现这个方法等效于getEnumByName(),但是当我们有很多枚举,每个枚举又需要通过各个字段获取的时候,
添加许多的get方法就有些笨重了,这个时候我们的方法就派上了大用场。
上面只是2个简单的小例子,当然反射的用途远不在此,尤其是各个框架到处可见反射的身影。
不过因为在一定程度上破坏了对象的封装性,所以建议要慎用。