Как я могу получить доступ к статической переменной по имени класса в Java?

#java #class #oop

#java #класс #ооп

Вопрос:

У меня есть много классов, которые имеют один и тот же статический атрибут (staticAttr), и у меня есть другой класс, который принимает имя класса и обращается к его staticAttr указанного имени класса. Как я могу это сделать. Пожалуйста, помогите мне! Спасибо.

Редактировать:

         public class Group_name1 extends Activity implements View.OnClickListener,
        {
            public static Group_name1 staticVar;

            public void onCreate(Bundle savedInstanceState) 
            {
                super.onCreate(savedInstanceState);
                setContentView(R.layout.group_name1);
                staticVar = this;
            }
         }
         public class Group_name2 extends Activity implements View.OnClickListener,
            {
                public static Group_name2 staticVar;
                public void onCreate(Bundle savedInstanceState) 
                {
                    super.onCreate(savedInstanceState);
                    setContentView(R.layout.group_name2);
                    staticVar = this;
                }
             }
  

Теперь моя проблема состоит в том, чтобы получить доступ к статической переменной этих классов в другом классе, просто указав строку имени класса. Теперь класс should можно использовать для получения staticVar, который содержит объект.

В настоящее время я создал отдельные классы для каждого класса, упомянутого выше, для ссылки на staticVar. Но я чувствую его избыточный и плохой стиль программирования, потому что каждый класс, который я пишу для ссылки на вышеупомянутые классы, выполняет ту же функцию. Единственное, что меняется, это ссылка на имя класса

Group_name1 grpActivity;
Group_name2 grpActivity;

Это мои текущие реализации. Но я хочу просто использовать имя класса для ссылки на статическую переменную

 class GroupNameListener1 extends Thread
{
    Group_name1 grpActivity;
        public void run()
        {
               grpActivity = Group_name1.staticVar;
               /*
                    do something
                */
        }
}
class GroupNameListener2 extends Thread
{
    Group_name2 grpActivity;
        public void run()
        {
               grpActivity = Group_name2.staticVar;
               /*
                    do something
                */
        }
}
  

Комментарии:

1. Используйте отражение Luke docs.oracle.com/javase/tutorial/reflect

2. Вы можете использовать отражение, но это может привести к беспорядку. Почему бы не иметь общий интерфейс, который реализуется всеми вашими классами, с определенным статическим методом (а не статической переменной), который каждый класс может реализовать для возврата по мере необходимости.

3. Пожалуйста, проверьте мое редактирование.

Ответ №1:

Вот так :

ClassWithStaticVariable.VariableName

если у вас есть

 class A {
  public static String a = "test"
}
  

затем вы можете получить к ней доступ следующим образом :

 class B {
  public void test() {
    System.out.println(A.a);
  }
}
  

Ответ №2:

Если я правильно вас понимаю, у вас есть что-то вроде

 class A {
  public static String str = "test"
}
  

и в вашем коде у вас есть такой метод, как

 void methodA (A someObj) {
  

в этом методе вы можете получить доступ к статической переменной

как

    A.str
  

или

   someObj.str
  

Комментарии:

1. @Vamshi синтаксис someObj.str , хотя и принят, не рекомендуется, поэтому предпочитайте A.str

Ответ №3:

У вас очень плохой дизайн. За исключением отражения, нет способа решить эту проблему в общем виде, как вы ее разработали.

Я полагаю, что вы пытаетесь прикрепить метаданные к своим классам. Очень простой способ сделать это — сохранить глобальную карту, содержащую данные (и работать с классом вместо его имени):

 public class MyClassMetaData {
    private final static Map<Class<?>, String> dataMap = new HashMap<>();

    static {
        dataMap.put(MyClassA.class, "TestA"); // one method of initialization
        dataMap.put(MyClass2.class, "Case2");
        // one line per class...
    }

    private MyClassMetaData() {
    }

    public static String getMetaData(Class<?> theClass) {
        return dataMap.get(theClass);
    }
}
  

Но вам нужно не забыть добавить строку, которая помещает данные в карту в статический блок при добавлении другого класса.

Если вам нужно инициализировать данные динамически, доступ к карте может потребоваться синхронизировать.