如何动态使用java中另一个类中定义的静态变量?

时间:2015-12-14 04:29:53

标签: java

我想动态设置在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";
} 

3 个答案:

答案 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,因为我需要设置更多变量。