Что-то вроде `this.class` вместо` ClassName.class`?
Когда я определяю классы обслуживания Android, я часто определяю (на самом деле, скопировать и вставлять) статические методы, которые запускают службу с данными:
public class MyShinyBackgroundService extends Service
{
...
// start this service if it not running; pass data
public static void startServiceWithData(String data, Context context) {
Intent intent = new Intent(context, MyBackgroundService.class);
intent.setAction(MY_ACTION);
intent.putExtra(DATA_KEY, data);
context.startService(intent);
}
}
Вероятно, вы уже видите ошибку: этот метод вызывает неправильную службу. (Глупый экземпляр и ошибка пасты. Это не произойдет, если я могу написать что-то вроде this.class
, но, к сожалению, оно не является синтаксически правильным.)
Есть ли способ в Java ссылаться на .class
этого "класса" из статического метода, отличного от имени класса?
ИЗМЕНИТЬ
Я не согласен с @CommonsWare в том, что этот вопрос повторяется, потому что мне нужно .class
, а не имя класса; тем не менее этот ответ действительно предложил достаточно хороший хак, который делает код скопированным/вставным:
Intent intent = new Intent(context, new Object(){}.getClass().getEnclosingClass());
(фигурные скобки в new Object(){}
важны!!!)
Я определенно предпочел бы менее хакерское решение, поэтому я прошу читателей проголосовать за повторное открытие этого вопроса.
РЕДАКТИРОВАТЬ 2
Теперь я склонен определять thisClass
как статический член класса private (закрытый, потому что было бы неправильно позволить этому члену класса наследоваться или ссылаться из другого места, поскольку MyShinyBackgroundService.thisClass
- это так же, как MyShinyBackgroundService.class
). Это действительно глупо, что class
является зарезервированным словом на Java, так что поле class
должно ссылаться через псевдоним.
private static Class thisClass = MyShinyBackgroundService.class;
...
public static void startServiceFrom(Context someContext) {
Intent intent = new Intent(someContext, thisClass);
someContext.startService(intent);
}