Как класс может получить доступ к своему собственному имени класса? - PullRequest
2 голосов
/ 11 мая 2009

Я использую Java-приложение, которое генерирует класс динамически. С помощью скрипта ant будет создан исходный код для заданного имени класса и шаблона класса.

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

Пример. Класс будет называться «VersionInfo». Затем в статическом main () этого я хочу вызвать статический метод: VersionInfo.getId (). Но я не знаю имя класса.

Есть ли эквивалент "this" для статического контекста или некоторый Utility-Class для такой цели?

Ответы [ 8 ]

7 голосов
/ 11 мая 2009

Если вы создаете класс через Ant, то почему бы просто не сгенерировать статический метод getClassName, который возвращает имя класса?

3 голосов
/ 11 мая 2009

Если ваш метод main находится в том же классе, вы можете просто вызвать getId() в методе main.

2 голосов
/ 11 мая 2009

Так вы говорите, что это должно сгенерировать это?

public class VersionInfo{ // VersionInfo class name changes, per problem description
    public static void main(){
        System.out.println(getId()); 
// but in the main within the class,we don't need the classname to call a static method
    }
    public static string getId(){
       return "what's the problem?";
    }
}

Чего-то не хватает в описании, что вы вызываете статический метод какого-то ДРУГОГО класса по имени неизвестного шаблону?

1 голос
/ 11 мая 2009

Попробуйте это:

package uk.co.farwell.stack_overflow;

public class Test_847708 {
    private final static String getId() {
        return "string";
    }

    public static void main(String args[]) {
        System.out.println("getId=" + getId());
    }

}
1 голос
/ 11 мая 2009

Я не уверен, что понимаю. Если вы генерируете класс VersionInfo самостоятельно, почему вы не можете получить имя класса из кода, который генерирует класс?

1 голос
/ 11 мая 2009

Есть неприятный обходной путь:

public static final Class THIS_CLASS = new Object() {
  public Class getParentClass() {
    return getClass().getEnclosingClass();
  }
}.getParentClass();
0 голосов
/ 11 мая 2009

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

Если по какой-то причине этого недостаточно, тогда объедините ответ Йоахима Сауэра и Мелурса, получите имя класса, а затем получите метод с помощью отражения:

Method m = THIS_CLASS.getDeclaredMethod("getId", null);
Object result = m.invoke(null, null);
0 голосов
/ 11 мая 2009

Вы не можете использовать ключ "this" в статическом контексте.

Вместо этого, если вы хотите динамически вызывать статическую функцию, вы можете использовать java отражение .

Я не могу помочь вам в дальнейшем для отражения Java, потому что я никогда не использую его, но я уже использую его в .Net, и это мощный инструмент.

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