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;
    }
}
相关推荐
等一场春雨16 分钟前
Java 23 集合框架详解:ArrayList、LinkedList、Vector
java·开发语言
Hello Dam17 分钟前
分布式环境下定时任务扫描时间段模板创建可预订时间段
java·定时任务·幂等性·redis管道·mysql流式查询
javaweiming17 分钟前
根据中文名称首字母进行分组
java·汉字转拼音
qincjun18 分钟前
Qt仿音乐播放器:媒体类
开发语言·qt
小白编程952722 分钟前
matlab离线安装硬件支持包
开发语言·matlab
桂月二二1 小时前
深入探索 Rust 中的异步编程:从基础到实际案例
开发语言·后端·rust
早上好啊! 树哥3 小时前
JavaScript Math(算数) 对象的用法详解
开发语言·javascript·ecmascript
Tomorrow'sThinker4 小时前
25年1月更新。Windows 上搭建 Python 开发环境:PyCharm 安装全攻略(文中有安装包不用官网下载)
ide·python·pycharm
noravinsc4 小时前
requests请求带cookie
开发语言·python·pycharm
风_流沙5 小时前
python pandas 对mysql 一些常见操作
python·mysql·pandas