我想动态设置在java中另一个类中定义的静态变量的值。
Class A
{
// Variable Definitions -
public static site1_URL = "";
public static site2_URL = "";
....
... More variable defns
...
}
在B类中,我想根据B类中的某个变量动态设置site1_URL或site2_URL或其他一些值。
Class B
{
....
if(var_x == "Site1")
A.Site1_URL = "www.google.com";
elseif(var_x == "Site2")
A.site2_URL = "www.google.com";
....
//instead of above I want to achieve -
A.<var_x>_URL = "www.google.com";
}
答案 0 :(得分:0)
对于静态变量,您在变量前加上类名,如下所示:
A.site1_URL = "www.google.com";
答案 1 :(得分:0)
您可以使用反射和Field
类
import java.util.*;
import java.lang.*;
import java.lang.reflect.*;
class A {
public static String site1_URL = "http://url1.com";
public static String site2_URL = "http://url2.com";
}
class B {
public void setUrl(String alias, String value) throws IllegalAccessException {
Field[] fields = A.class.getDeclaredFields();
for(Field field : fields) {
if(field.getName().equals(alias + "_URL")) {
field.set(field, value);
}
}
}
}
class Application {
public static void main(String args[]) throws IllegalAccessException {
B b = new B();
b.setUrl("site1", "a1"); // sets value
b.setUrl("site2", "a2"); // sets value
b.setUrl("site3", "a3"); // does nothing
System.out.println(A.site1_URL); // prints a1
System.out.println(A.site2_URL); // prints a2
}
}
另一种方法是重构代码并使用Map
import java.util.*;
import java.lang.*;
class Site {
private String url;
public Site(String url) {
this.url = url;
}
public void setUrl(String url) {
this.url = url;
}
public String getUrl() {
return url;
}
}
class A {
public static Map<String, Site> sites;
static {
sites = new HashMap<>();
sites.put("site1", new Site("http://url1.com"));
sites.put("site2", new Site("http://url2.com"));
}
}
class B {
public void setUrl(String alias, String value) {
if(A.sites.containsKey(alias)) {
A.sites.get(alias).setUrl(value);
}
}
}
class Application {
public static void main(String args[]) {
B b = new B();
b.setUrl("site1", "a1");
b.setUrl("site2", "a2");
b.setUrl("site3", "a3");
System.out.println(A.sites.get("site1").getUrl());
System.out.println(A.sites.get("site2").getUrl());
}
}
我认为第二种方式更可取,反思速度慢,在这种特殊情况下没有多大意义。同样在第二种情况下,您可以更改别名或迭代抛出Map
。您可以轻松修改Site
类,为其添加其他字段和方法。
答案 2 :(得分:-2)
考虑如上所述的A类定义。
Class B
{
....
if(var_x == "Site1")
A.Site1_URL = "www.google.com";
elseif(var_x == "Site2")
A.site2_URL = "www.google.com";
....
//instead of above I want to achieve -
A.<var_x>_URL = "www.google.com";
}
我不想使用switch或if-elseif-else,因为我需要设置更多变量。