1.4 java反射机制 简单的java反射机制实践

这是一个项目用于学习反射

第一个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;
    }
}
相关推荐
三皮仔2 分钟前
安装WPS后,导致python调用Excel.Application异常,解决办法
python·excel·wps
DXX——13 分钟前
嵌入式基础学习|C语言篇——结构体(含进阶)二
c语言·开发语言·学习
兀行者(做个有情怀的java程序员)13 分钟前
什么是Java虚拟机(JVM)?它的作用是什么?
java·开发语言·jvm
liberty03070623 分钟前
40环状DNA序列的最小表示法Java版-青训营刷题
java·开发语言
java_python源码34 分钟前
[含文档+PPT+源码等]精品基于Python实现的django个性化健康餐计划订制系统
开发语言·前端·python
招风的黑耳34 分钟前
Java+vue前后端分离项目集群部署
java
pumpkin8451437 分钟前
PlantUML 总结
开发语言
Excuse_lighttime38 分钟前
二叉树的遍历方式和子问题思路
java·开发语言·数据结构·算法
北执南念1 小时前
Synchronized使用
android·java·jvm
金融OG1 小时前
100.14 AI量化面试题:模型蒸馏(Model Distillation)和模型微调(Fine-tuning)的异同点
人工智能·python·机器学习·数学建模·金融