根据我对java的了解,我不认为这是可能的,但我想向那些知识远远超过我的人提出这个问题。
如果我有一个静态变量说,
public static String NAME = "james";
有没有办法,通过反思或其他方式,为所述变量创建一个监听器,以便其他人调用:
ClassName.NAME
可以在获得结果之前对其进行修改,因此我可以更改NAME的值,使其等于" simon"代替?
要清楚,此代码库不是我自己的,我无法更改变量而是使用getter和setter。我知道这会使这更加简单,但不幸的是,这不是一个选择。
答案 0 :(得分:6)
不,你不能。这是您不应该使用public
变量的原因之一。始终使用private
或protected
个变量,并通过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);
}
}
不确定这是否能解答您的问题。