как получить константу в Java с классом - PullRequest
11 голосов
/ 19 мая 2010

В основном мне нужно получить константу для класса, но у меня нет экземпляра объекта, а есть только его класс. В PHP я бы сделал constant(XYZ); Есть ли подобный способ получения константы в JAVA?

Мне это нужно для облегчения динамического вызова getMethod

Class parameterType = Class.forName(class_name);
object.setProperty(field name, field value, parameterType);

метод set property затем получит правильный метод и установит указанное свойство, однако я не могу получить метод, который имеет тип int в качестве параметра без использования Interger.TYPE

Ответы [ 5 ]

32 голосов
/ 02 ноября 2010

Вы можете искать что-нибудь. как
Foo.class.getDeclaredField("THIS_IS_MY_CONST").get(null); или же Class.forName("Foo").getDeclaredField("THIS_IS_MY_CONST").get(null); (спасибо ф-о-о )

Получает значение константы String (THIS_IS_MY_CONST) в классе Foo.

Обновление используйте null в качестве аргумента для get спасибо acdcjunior

2 голосов
/ 19 мая 2010

Если эта константа является метаданными о классе, я бы сделал это с аннотациями :

Первый шаг, объявить аннотацию:

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
@interface Abc {
    String value(); 
}

Шаг второй, комментируйте свой класс:

@Abc("Hello, annotations!")
class Zomg {

}

Шаг третий, получить значение:

String className = "com.example.Zomg";
Class<?> klass = Class.forName(className);
Abc annotation = klass.getAnnotation(Abc.class);
String abcValue = annotation.value();
System.out.printf("Abc annotation value for class %s: %s%n", className, abcValue);

Вывод:

Abc annotation value: Hello, annotations!
1 голос
/ 19 мая 2010

Я не уверен, что вы хотите выйти. Но это не должно быть слишком сложно, чтобы показать вам пример.

Допустим, у вас есть Class Foo с панелью свойств.

Class Foo {
    private final String bar = "test";
    public String getBar() {return bar;}
}

Теперь, чтобы обдумать это, вы должны:

Class fooClass = Foo.class;
Object fooObj = fooClass.newInstance();
Method fooMethod = fooClass.getMethod("getBar");
String bar = (String) fooMethod.invoke(fooObj);

Теперь вы получите значение метода getBar () в переменной bar

0 голосов
/ 21 октября 2018

Если вы не хотите загружать или инициализировать класс, ClassGraph может сделать это:

String fieldVal;
try (ScanResult scanResult =
        new ClassGraph().whitelistClasses(className).enableFieldInfo().scan()) {
    fieldVal = (String) scanResult.getClassInfo(className).getFieldInfo("s")
            .getConstantInitializerValue();
}

N.B. это работает только для постоянных значений инициализатора (значений, которые могут быть вычислены без создания экземпляра объекта, за исключением String), назначенных статическим конечным полям . Компилятор может создать константу во время компиляции для простой арифметики и простой конкатенации строк.

(отказ от ответственности, я автор ClassGraph)

Простое использование отражения для доступа к статическим полям проще, если вы не против загрузить класс, как указано в этом другом ответе: https://stackoverflow.com/a/4076792/3950982

0 голосов
/ 19 мая 2010

Может быть, я не понимаю, что вам нужно, но вы пробовали использовать конечные статические атрибуты и статические методы?

Окончательный означает, что его нельзя изменить после установки, поэтому вы получите константу. Статический означает, что он доступен, даже если в классе нет объектов.

...