1.java自定义注解,元注解的使用 ,元注解中值详解
元注解:用于注解注解的注解…
元注解共有4个:
①、@Target:用于明确注解用于目标类的哪个位置
ElementType枚举类的值:
Type:用于注解类
Fields:用于注解属性
Methods:用于注解方法
Parameter:用于注解参数
…
②、@Retention:用于标识自定义注解的声明周期
RetentionPolicy枚举类的值:
SOURCE:没有被编译器编译
CLASS:不会在运行时,被JVM保留
RUNTIME:生命周期持续到运行时,能够通过反射获取到
③、@Documented:用于标识自定义注解能够使用javadoc命令生成关于注解的文档
④、@Inherited:用于标识使用注解的类被继承时,同样能够继承此自定义注解,也就是相当于子类也使用了此自定义注解
2.Json序列化
1、使用JSON.toJSONString(object),如果object对象中的属性为null,则不会参与序列化;
2、依然使用fastjson,使用SerializerFeature.WriteMapNullValue参数,不过滤null,null也会传递给前端;
String s = JSONObject.toJSONString(vo,SerializerFeature.WriteMapNullValue);
2、使用jsckson转json
ObjectMapper mapper = new ObjectMapper();
mapper.setSerializationInclusion(Include.ALWAYS);
String s =mapper.writeValueAsString(vo);
//Include.ALWAYS 默认,不会过滤null
//Include.NON_NULL 属性为NULL将不参与序列化
//Include.NON_DEFAULT 属性为默认值不参与序列化
//Include.NON_EMPTY 属性为“” 或 NULL都不参与序列化
3.基于以上两点,自定义注解@MyJsonIgnore.当作用于属性上时,使用Json序列化忽略掉当前所作用的属性
1.自定义注解
/**
* 自定义Json忽略注解
*
* @author guofucheng
* @date 2020/11/19
*/
@Documented
@Inherited
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.FIELD,ElementType.TYPE})
public @interface MyJsonIgnore {
//TODO 可扩展支持在类上,将忽略的字段名称填入
/**
* 忽略的属性名
*/
String[] name() default {};
}
2.封装Json工具类
/**
* Json序列化工具类
*
* @author guofucheng
* @date 2020/11/19
*/
public class MyJsonUtil<T> {
/**
* 得到Jon字符串
* 使用步骤:
* 1.在要忽略的属性上使用@MyJsonIgnore
* 2.调用getJonString得到对应的Json字符串
* @param t t
* @return {@link String}
*/
public static <T> String getJonString(T t) {
Class<?> clazz = t.getClass();
Field[] fields = clazz.getDeclaredFields();
for (Field field : fields) {
if (field.isAnnotationPresent(MyJsonIgnore.class)) {
field.setAccessible(true);
MyJsonIgnore myJsonIgnore = field.getAnnotation(MyJsonIgnore.class);
if (myJsonIgnore !=null){
String propertyName = field.getName();
Method method = null;
try {
method = clazz.getDeclaredMethod(getSetterName(propertyName), field.getType());
Object a=null;
method.invoke(t, a);
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
return JSON.toJSONString(t);
}
private static String getSetterName(String propertyName) {
return "set" + propertyName.substring(0, 1).toUpperCase() + propertyName.substring(1);
}
}
3.测试案例
/**
* 测试的实体类
*
* @author guofucheng
* @date 2020/11/20
*/
public class User{
private String name;
@MyJsonIgnore
private String gender;
private Integer age;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getGender() {
return gender;
}
public void setGender(String gender) {
this.gender = gender;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
}
/**
* MyJsonIgnoreDemo测试
*
* @author guofucheng
* @date 2020/11/20
*/
public class MyJsonIgnoreDemo {
public static void main(String[] args) {
User user=new User();
user.setName("guofucheng");
user.setGender("男");
user.setAge(18);
System.out.println(MyJsonUtil.getJonString(user));
}
}
结果打印:
{“age”:18,“name”:“guofucheng”}
Process finished with exit code 0