这是一个项目用于学习反射
第一个demo是利用反射构建一个对象转换为JSON
第二个demo是用于利用类的名字以及方法名就可以直接执行的实例
java
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();
}
}
java
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} );
}
}
java
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 "";
}
java
package com.zy.reflectiondemo.POJO;
import com.zy.reflectiondemo.annotation.JsonField;
public class User {
@JsonField("id")
private Long userId;
@JsonField
private 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;
}
}