反射在java里面是必须学会的知识,特别是在框架里面。之前对反射有些模糊不清,现在通过写博客来记录自己学习反射的知识。下面实现一个demo:通过注解的方式给某个类的属性赋值。
- 定义注解
@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target(value=ElementType.FIELD)
public @interface Value {
String value();
}
- 定义User类
public class User {
@Value("1")
private Integer id;
@Value("张三")
private String username;
@Value("123456")
private String password;
public Integer getId() {
return id;
}
public void setId( Integer id) {
this.id = id;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
@Override
public String toString() {
return "User [id=" + id + ", username=" + username + ", password=" + password + "]";
}
}
- 代码实现
public class FanSheApp {
public static void main(String[] args) {
try {
User user = new User();
System.out.println(user.getClass() == User.class);
fgx();
Class<?> clazz = Class.forName("hhy.javaboy.fanshe.User");
Method[] methods = clazz.getDeclaredMethods();
for(Method method : methods) {
System.out.println(method.getName());
}
fgx();
Method m0 = clazz.getDeclaredMethod("setPassword", String.class);
m0.invoke(user, "123456");
System.out.println(user.getPassword());
fgx();
//获取类属性字段
Field[] declaredFields = clazz.getDeclaredFields();
for(Field declaredField : declaredFields) {
declaredField.setAccessible(true);
//判断类型是否属于String类型
if(declaredField.getType() == String.class) {
//给这个属性赋值
declaredField.set(user, declaredField.getAnnotation(Value.class).value());
}else{
//获取这个字段的类型,Integer,Long,Double....
String typeSImpleName = declaredField.getType().getSimpleName();
//获取这个类型中的类型转换方法,例如:parseInteger()、parseLong().....
Method method = declaredField.getType().getMethod("parse"+fixparse(typeSImpleName), String.class);
if(method != null) {
//反射调用方法
Object ret = method.invoke(null, declaredField.getAnnotation(Value.class).value().toString());
//当前字段赋值
declaredField.set(user, ret);
}
}
}
System.out.println(user.toString());
fgx();
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (NoSuchMethodException e) {
e.printStackTrace();
} catch (SecurityException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (IllegalArgumentException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
}
}
static String fixparse(String type) {
System.out.println(type);
switch(type) {
case "Integer":
return "Int";
case "Double":
return "Double";
default :
return type;
}
}
static void fgx() {
System.out.println("------------");
}
}