这是一个项目用于学习反射
第一个demo是利用反射构建一个对象转换为JSON
第二个demo是用于利用类的名字以及方法名就可以直接执行的实例
package com.zy.reflectiondemo.utils;import com.zy.reflectiondemo.annotation.JsonField;import java.lang.reflect.Field;
import java.util.HashMap;
import java.util.Map;
import java.util.StringJoiner;
/***
该案例是一个利用反射获取对象的所有段的值,并且将他输出为json的案例***/public class JsonSerializer {public static String serialize(Object obj) {Map<String, Object> map = new HashMap<>();Class<?> clazz = obj.getClass();Field[] declaredFields = clazz.getDeclaredFields();for (Field field : declaredFields) {if(field.isAnnotationPresent(JsonField.class)){field.setAccessible(true);JsonField annotation = field.getAnnotation(JsonField.class);String key="";if (annotation.value().isEmpty()) {key=field.getName();}else {key=annotation.value();}try {Object o = field.get(obj);map.put(key,o);} catch (IllegalAccessException e) {throw new RuntimeException(e);}}}System.out.println(map);return toJsonString(map);}private static String toJsonString(Map<String, Object> jsonElements) {StringJoiner json = new StringJoiner(",", "{", "}");for (Map.Entry<String, Object> entry : jsonElements.entrySet()) {json.add("\"" + entry.getKey() + "\":\"" + entry.getValue() + "\"");}return json.toString();}
}
package com.zy.reflectiondemo.utils;import com.zy.reflectiondemo.POJO.User;import java.lang.reflect.Method;/**** 该方法利用反射,输入方法名称,以及方法参数,就可以执行方法*/
public class Myinvoke {public static Object MyinvokeMethod(String classname,String methodname,Class<?> []paratypes,Object[]args) throws Exception {Class<?> clazz = Class.forName(classname);Method method = clazz.getMethod(methodname, paratypes);Object instance = clazz.getDeclaredConstructor().newInstance();return method.invoke(instance,args);}public static void main(String[]args) throws Exception {String classname = JsonSerializer.class.getName();User user=new User(123L,"zy",23,"123");MyinvokeMethod(classname,"serialize",new Class<?>[]{Object.class}, new Object[] {user} );}
}
package com.zy.reflectiondemo.annotation;import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.FIELD)
public @interface JsonField {String value() default "";
}
package com.zy.reflectiondemo.POJO;import com.zy.reflectiondemo.annotation.JsonField;public class User {@JsonField("id")private Long userId;@JsonFieldprivate String name;@JsonField("age")private int userAge;private String password; // 不标注的字段将被忽略public User(Long userId, String name, int userAge, String password) {this.userId = userId;this.name = name;this.userAge = userAge;this.password = password;}
}