不积跬步,无以至千里;不积小流,无以成江海
文章目录
元注解
描述注解的一种方式
@Retention
定义注解的生命周期:source->class->runtime
@Documented
文档注解,会被Javadoc工具文档化
@Inherited
是否让子类继承该注解
@Target
描述了注解的应用范围
- type:表示可以用来修饰类,接口、注解类型或者枚举类型;
- package:可以用来修饰包;
- parameter:可以用来修饰参数;
- annotation_type:可以用来修饰注解类型;
- method:可以用来修饰方法;
- field:可以用来修饰属性(包括枚举常量);
- constructor:可以用来修饰构造器;
- local_variable:可以用来修饰局部变量;
反射(reflection)
在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为Java语言的反射。
反射的优缺点:
- 通过反射可以使程序代码访问装载到jvm中的类的内部信息,获取已装载类的属性信息,获取已装载类的方法,获取已装载类的构造方法信息。
- 反射提高了Java程序的灵活性和扩展性,降低耦合性,提高自适应能力。
- 反射会对性能造成一定的影响,同时让代码的可读性变低。
应用
在工作中可能会遇到页面展示内容不确定的情况。这时就可以试一下自定义注解加反射的方式。日后增加展示内容也只是在对应的属性加上注解。
创建自定义注解@FiledInfo
@Target({ElementType.FIELD})
@Retention(RetentionPolicy.RUNTIME)
public @interface FiledInfo {
String name() default "";
}
创建User对象
@Data
@Accessors(chain = true)
public class User {
@FiledInfo(name = "性别")
private String sex;
@FiledInfo(name = "姓名")
private String name;
private String phone;
}
反射方法
public static List<Map<String, Object>> listFiledInfo(Object object) throws Exception{
//通过反射获取到class类元信息
Class<?> aClass = object.getClass();
Field[] fields = aClass.getDeclaredFields();
List<Map<String, Object>> list = new ArrayList<>();
for (Field field : fields) {
//设置属性为可见
field.setAccessible(true);
//从属性上获取注解
FiledInfo info = field.getAnnotation(FiledInfo.class);
if (info != null) {
Map<String, Object> map = new HashMap<>(16);
map.put("name", info.name());
//获取该对象的属性值
map.put("value", field.get(object));
list.add(map);
}
}
return list;
}
测试方法
public static void main(String[] args) throws Exception{
User user = new User().setName("张三").setSex("男");
List<Map<String, Object>> list = listFiledInfo(user);
System.out.println(list);
}
返回结果:
[{name=性别, value=男}, {name=姓名, value=张三}]