m0_70880131 2024-03-27 11:01 采纳率: 50%
浏览 2

怎样区分不同的成员变量的赋值类型

请教问题:
如下图所示,在一个Java class文件里,有很多的成员变量,绿色圈里的所有变量全是附好一个固定值了的,准备保留在这里的。而红色圈里的所有变量要么是去实例化一个class对象,要么通过调用别的class去附个值,但是有可能调用的class根本还没实例化,这样直接调用会产生NPE或者别的异常,所以红色的圈里的所有变量都得移走,不能直接放在方法外,需要封在方法里。
目前我的诉求,需要一个通用方法,能自动读取每个class的所有成员变量,然后区分哪些需要移走,哪些需要保留,谢谢🙏

回答满意的,我自会打赏~

能教我写个方法把红色的那一圈的所有变量和绿色的那一圈区分开吗?

img

  • 写回答

3条回答 默认 最新

  • 专家-皆知 2024-03-27 11:01
    关注

    引自免费微信小程序:皆我百晓生

    首先,我理解你的需求是想要创建一个方法来区分成员变量,这个方法可以自动读取所有成员变量,并判断它们是否需要实例化一个类对象或者调用其他类来获取值。然后,将需要实例化或者调用的变量移走,只保留需要保留的变量。

    根据你提供的代码,我发现你已经在类中使用了多个静态变量,这些变量可能是需要保留的,因为它们被声明为静态,并且没有在类的方法中改变。

    下面是一个可以实现你需求的方法,它遍历类的所有成员变量,并检查它们是否需要实例化一个类对象或者调用其他类来获取值。如果需要实例化或者调用,则将该变量移走,否则保留该变量。

    public static void filter会员变量(Class<?> clazz) {
        Field[] fields = clazz.getDeclaredFields();
        for (Field field : fields) {
            field.setAccessible(true);
            try {
                Object value = field.get(clazz);
                if (value instanceof Class) {
                    // 如果变量值是类对象,则可能是需要实例化的变量,移走该变量
                    field.setAccessible(false);
                    continue;
                }
                if (value instanceof Xxxx) {
                    // 如果变量值是Xxxx类的实例,则可能是需要调用的变量,移走该变量
                    field.setAccessible(false);
                    continue;
                }
                // 如果变量值不是类对象或者Xxxx类的实例,则保留该变量
            } catch (IllegalAccessException e) {
                e.printStackTrace();
            }
        }
    }
    

    这个方法接受一个类作为参数,然后遍历该类的所有成员变量。对于每个成员变量,它首先尝试获取该变量的值,然后判断该值是否是类对象或者Xxxx类的实例。如果是,则将该变量设为不可访问,并继续遍历下一个变量。如果不是,则保留该变量。

    你可以使用这个方法来过滤掉红色圈里的变量,并保留绿色圈里的变量。

    评论 编辑记录

报告相同问题?

问题事件

  • 修改了问题 3月27日
  • 创建了问题 3月27日