Как узнать, кто использует класс?

232
12 апреля 2017, 12:44

На низком уровне нужно определить имя класса, который его использует. Возможно ли это? Вижу решение в передаче имени в конструктор, но это мне не нравится. Упрощенный пример (в классе MyCommonClass нужно узнать имя класса, который его использует ):

package com.tasks5.extenden;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
public class MyApp {
    static Logger log = LogManager.getLogger(MyApp.class.getName());
    public static void main(String args[]){
        MyCommonClass test = new MyCommonClass(MyApp.class.getName());
        log.info("test info maun class");
    }
}

package com.tasks5.extenden;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
public class MyCommonClass {
    static Logger log = LogManager.getLogger();
    public MyCommonClass(String UsesClassName){
       log = LogManager.getLogger(UsesClassName);
   }
   public void Run(){
        log.info("info test");
   }
 }
Answer 1

То, что вы хотите сделать - плохо. Это нарушение как минимум трех принципов хорошего кода сразу: принципа малой связности, принципа единой ответственности и принципа минимальной информированности.

Если прямо вот вообще никак не избежать использования таких костылей, то не усложняйте себе жизнь - явно передавайте контекст в методы класса, которым он нужен (как самый наглядный пример - Context в Android) или, в самом крайнем случае, в конструктор.

Answer 2

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

Thread.currentThread().getStackTrace()

Answer 3

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

ClassLoader

Получить текущий можно например так:

ClassLoader.getSystemClassLoader()

Далее, немного магии Reflection, и у вас будет

Vector<Class<?>> classes

по факту, это все загруженные классы.

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

READ ALSO
Можно ли с помощью Java нажать кнопку на сайте?

Можно ли с помощью Java нажать кнопку на сайте?

Здравствуйте,допустим на этом сайте я хочу с помощью java нажать на кнопку-"Задать вопрос"По средствам чего это можно сделать и можно ли вообще?

315
Как выделить дни в Calendar View?

Как выделить дни в Calendar View?

Добрый день! Есть задача: выделять определенные дни цветамиОдин день я выделить цветом могу,а вот несколько

266
Какая разница между execute() и submit() у ExecutorService?

Какая разница между execute() и submit() у ExecutorService?

У ExecutorService есть два метода:

236
Что значит аннотация @RequestApi

Что значит аннотация @RequestApi

Метод помеченный аннотацией @RequestApi не выполнится?

238