Java, получить объект класса для содержания класса, не класс времени выполнения - PullRequest
2 голосов
/ 02 октября 2009

Рассмотрим этот код Java

class A{
 //@returns Class object this method is contained in
 // should be A in this case
 public Class<?> f() {
   return getClass();
 }
}

class B extends A {}

B b = new B();

System.out.println(b.f());
//output -- B.class (Wrong, should be A.class)

внутри f() я не могу использовать getClass(), потому что это даст мне тип runtype, B. Я ищу способ получить Class объект class f() внутри (без упоминания A явно, очевидно)

Ответы [ 5 ]

6 голосов
/ 02 октября 2009

new Object() {}.getClass().getEnclosingClass(). Но, пожалуйста, не надо!

4 голосов
/ 02 октября 2009

Вы можете использовать средство трассировки стека исключений, чтобы сделать что-то вроде этого:

public String f() {
    Exception E = new Exception();
    E.fillInStackTrace();
    return E.getStackTrace()[0].getClassName(); // load it if you need to return class
}
2 голосов
/ 02 октября 2009

Я бы сказал, что было бы намного проще и понятнее просто вернуть A.class, как подсказал @mmyers. Нет особого смысла пытаться получить его во время выполнения, если вы на самом деле не хотите получить значение времени выполнения. Единственная проблема, которая возникает, заключается в том, что если вы реорганизуете имя класса, а другой с таким же именем окажется в том же пакете.

Я бы воспользовался этим шансом для ясности в коде.

1 голос
/ 02 октября 2009

Я знаю, что вы сказали, что не хотите явно упоминать A.class

class A {        
    public Class<?> f() {
        return A.class;
    }   
}

но я изо всех сил пытаюсь найти вариант использования, где приведенный выше код не является удовлетворительным.

1 голос
/ 02 октября 2009

Вы можете использовать

class.getMethod("f",parameterTypes).getDeclaringClass()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...