繁体   English   中英

访问时修改静态变量

[英]Modify a Static Variable when accessed

根据我对java的了解,我不认为这是可能的,但我想向那些知识远远超过我的人提出这个问题。

如果我有一个静态变量说,

public static String NAME = "james";

有没有办法,通过反射或其他方式,为所述变量创建一个监听器,以便如果其他人调用:

ClassName.NAME

它可以在得到结果之前修改,所以我可以改变NAME的值,使它等于“simon”而不是?

要清楚,这个代码库不是我自己的,我不能改变变量而是使用getter和setter。 我知道这会使这更简单,但不幸的是,这不是一个选择。

不,你不能。 这就是你不应该使用public变量的原因之一。 始终使用privateprotected变量,并通过类似static public String getName()的getter方法访问它们。 这样你就可以将任何逻辑放入你想要的getter中。

在计算机科学中有一种说法,你可以通过“ 另一层次的间接 ”来实现任何目的,因此使用一种访问方法:

public class Foo {

    private static String name;

    public static String getName () {
        String result = name;
        //do a lot of other things.
        return result;
    }


}

否则,我认为这是不可能的。 您可以重写字节代码:这样每次调用该项都会被首先执行其他操作所取代。 但这非常复杂。

如果它不是你自己的,你不能这样做,除非付出巨大的努力(重写字节码)。

你可以做一些技巧来实现这一点,你不能直接修改它,但你可以使用公共静态方法来访问该变量。

另一方面,我同意Sotirios Delimanolis你可以用方面来实现这一点。

您可以为该变量创建切入点,以便在其之前,之后或周围对其进行修改。

对我来说,最好的方法是创建一个private static variable并通过public static method访问它,然后use aspects访问此方法并根据需要应用前/后逻辑。

您可以使用反射编辑静态变量的值。

public class LoadClass {
    public static String name="James";
    public void disp(){

    }
    public static void main(String[] args) throws NoSuchFieldException, SecurityException, IllegalArgumentException, IllegalAccessException {
        Field field = LoadClass.class.getDeclaredField("name");
        System.out.println(field.get(new LoadClass()));
        field.set(new LoadClass(), "simon");
        System.out.println("get field value " +field.get(new LoadClass()));
        System.out.println("After change : " + name);
    }

}

不确定这是否回答了你的问题。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM