前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >写几个java反射工具方法

写几个java反射工具方法

作者头像
写一点笔记
发布2022-08-11 17:33:34
3360
发布2022-08-11 17:33:34
举报
文章被收录于专栏:程序员备忘录程序员备忘录

在java中使用反射是常规操作,我们经常需要面对未知的属性或者经过层层代理或者委派等情况下的属性值,在不能给对方定性的基础上,我们就可以采用一刀切的方式去解决问题。毕竟根本的这些属性均在于与各个变形中。比如前些时候我们说的拦截器实现主从库抉择的问题。这块我们写几个反射的工具类已被后用!

代码语言:javascript
复制
public class FansheUtils {

    static Field getDeclaredField(String clazz, String fieldName) throws ClassNotFoundException {
        Field field=null;
        Class clz = Class.forName(clazz);
        //super class
        for (Class<?> s = clz; s != Object.class; s = s.getSuperclass()) {
            try {
                field= s.getDeclaredField(fieldName);
                field.setAccessible(true);
            } catch (NoSuchFieldException ignored) {
            }
        }
        return field;
    }
    
    public static <T> T getFieldValue(Object object, String fieldName) throws ClassNotFoundException {
        Field field = getDeclaredField(object.getClass().getName() , fieldName);
        if (field == null) {
            throw new IllegalArgumentException("Could not find field [" + fieldName + "] on target [" + object + "]");
        }
        Object result = null;
        try {
            result = field.get(object);
        } catch (IllegalAccessException ignored) {
        }
        return (T) result;
    }


    public static void setFieldValue(Object object, String fieldName, Object value) throws ClassNotFoundException {
        Field field = getDeclaredField(object.getClass().getName() , fieldName);
        try {
            //set public
            if (field.isAccessible()) {
                field.set(object, value);
            } else {
                //set privite
                field.setAccessible(true);
                field.set(object, value);
                field.setAccessible(false);
            }
        } catch (IllegalAccessException ignored) {
        }
    }

    protected Method getMethodByName(String methodName, Class<?> entityClazz) {
        Method[] methods = entityClazz.getMethods();
        Method method = null;
        for (Method i : methods) {
            if (methodName.equals(i.getName())) {
                method = i;
                break;
            }
        }
        return method;
    }
}

测试一下:

代码语言:javascript
复制
public class TestFanshe {

    static class Test{
        private String name;

        private int age;

        @Override
        public String toString() {
            return "TestFanshe{" +
                    "name='" + name + '\'' +
                    ", age=" + age +
                    '}';
        }
    }

    public static void main(String[] args) throws ClassNotFoundException {
        Test test=new Test();
        String name=FansheUtils.getFieldValue(test,"name");
        System.out.println(name);
        FansheUtils.setFieldValue(test,"name","tianjingle");
        FansheUtils.setFieldValue(test,"age",1);
        System.out.println(test.toString());
    }
}

午安~

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2021-08-21,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 写点笔记 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档