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;
    }
}
相关推荐
MicoZone3 分钟前
JDK源码
java
花酒锄作田21 分钟前
[python]基于动态实例的命令处理设计
python
Evand J21 分钟前
【matlab例程】无迹粒子滤波(UPF)的例程,用于三维环境下多雷达目标跟踪,非线性系统
开发语言·matlab·目标跟踪
2501_9248787341 分钟前
无人机光伏巡检缺陷检出率↑32%:陌讯多模态融合算法实战解析
开发语言·人工智能·算法·视觉检测·无人机
Resean022344 分钟前
SpringMVC 6+源码分析(二)DispatcherServlet实例化流程 1
java·spring boot·spring·servlet·springmvc
计算机毕设定制辅导-无忧学长1 小时前
InfluxDB 与 Python 框架结合:Django 应用案例(三)
开发语言·python·django
惜.己1 小时前
python中appium
开发语言·python·appium
小沈熬夜秃头中୧⍤⃝1 小时前
Python 入门指南:从零基础到环境搭建
开发语言·python
睿思达DBA_WGX1 小时前
Python 程序设计讲义(54):Python 的函数——函数概述
开发语言·python
真智AI1 小时前
打破数据质量瓶颈:用n8n实现30秒专业数据质量报告自动化
大数据·运维·人工智能·python·自动化