访问时修改静态变量

时间:2014-07-09 15:22:36

标签: java

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

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

public static String NAME = "james";

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

ClassName.NAME

可以在获得结果之前对其进行修改,因此我可以更改NAME的值,使其等于" simon"代替?

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

4 个答案:

答案 0 :(得分:6)

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

答案 1 :(得分:2)

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

public class Foo {

    private static String name;

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


}

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

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

答案 2 :(得分:1)

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

另一方面,我同意Sotirios Delimanolis您可以使用方面来实现这一目标。

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

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

答案 3 :(得分:0)

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

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);
    }

}

不确定这是否能解答您的问题。