Класс отражения солнечной упаковки устарел [дубликат]

Я добавляю файл jar в SPARK_CLASSPATH в spark-env.sh, он работает.

export SPARK_CLASSPATH=$SPARK_CLASSPATH:/local/spark-1.6.3-bin-hadoop2.6/lib/mysql-connector-java-5.1.40-bin.jar
10
задан R. Martinho Fernandes 8 November 2009 в 15:53
поделиться

9 ответов

Java 9: ​​API-интерфейс стека

JEP 259 обеспечивает эффективный стандартный API для стековой ходьбы, который позволяет легко фильтровать и ленивый доступ к информации в трассировке стека. Во-первых, вы должны получить экземпляр StackWalker:

import static java.lang.StackWalker.Option.RETAIN_CLASS_REFERENCE;
// other imports

StackWalker walker = StackWalker.getInstance(RETAIN_CLASS_REFERENCE);

Вы можете вызвать метод getCallerClass():

Class<?> callerClass = walker.getCallerClass();

Независимо от того, как вы настроили StackWalker, метод getCallerClass будет игнорировать кадры отражения, скрытые кадры и те, которые связаны с MethodHandle s. Кроме того, этот метод не следует вызывать в первом стеке стека.

6
ответ дан Ali Dehghani 25 August 2018 в 20:23
поделиться

foo () является закрытым, поэтому вызывающий объект всегда будет в классе A.

4
ответ дан alternative 25 August 2018 в 20:23
поделиться

Хакерное решение - sun.reflect.Reflection.getCallerClass.

public void foo() {
    Class<?> caller = sun.reflect.Reflection.getCallerClass();
    // ...
}

Это хаки, потому что вы должны убедиться, что класс, вызывающий Reflection.getCallerClass(), загружен в bootstrap ClassLoader для аннотации @CallerSensitive (которую getCallerClass помечен) для работы. Таким образом, это, вероятно, не лучшее решение для проекта, если только ваш проект не использует агент Java , чтобы добавить ваши классы в поиск начальной загрузки ClassLoader.

0
ответ дан AMDG 25 August 2018 в 20:23
поделиться

Самый простой способ заключается в следующем:

String className = new Exception().getStackTrace()[1].getClassName();

Но в реале не должно быть необходимости в этом, если только для некоторых целей ведения журнала, потому что это довольно дорогостоящая задача. Что это, проблема, для которой вы думаете, что это решение? Мы можем придумать -лучшие предложения.

Изменить: вы прокомментировали следующее:

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

Затем я настоятельно рекомендую искать существующую библиотеку ORM , такую ​​как Hibernate , iBatis или любая реализация JPA на ваш вкус .

28
ответ дан BalusC 25 August 2018 в 20:23
поделиться
  • 1
    в основном я пытаюсь выполнить Layer базы данных, и в классе A я создам метод, который будет генерировать SQL-выражения, такие операторы динамически генерируются путем получения значений всех общедоступных свойств вызывающего класса. – Mark Buhagiar 8 November 2009 в 14:44
  • 2
    @Mark: это действительно плохой дизайн. Я бы глубоко пересмотрел его. – R. Martinho Fernandes 8 November 2009 в 14:50
  • 3
    @Peter: Thread.currentThread().getStackTrace()[0].getMethodName() всегда "getStackTrace". Угадайте, что вы можете понять, почему ... – R. Martinho Fernandes 8 November 2009 в 15:36
  • 4
    @Mark, это дает вам имя класса, но не INSTANCE. Другими словами, какой объект WHICH вы получите из публичных полей. Вы должны передать объект данных. – Thorbjørn Ravn Andersen 8 November 2009 в 15:45
  • 5
    @Peter: посмотрите исходный код Thread#getStackTrace(). Правильно ... Это делает new Exception().getStackTrace(). – BalusC 15 April 2013 в 13:15

Возможно, для вашего случая использования было бы целесообразно передать класс вызывающего объекта в метод, например:

public class A { public void foo(Class<?> c) { ... } }

И называть его примерно так:

public class B { new A().foo(getClass() /* or: B.class */ ); }
14
ответ дан Fabian Steeg 25 August 2018 в 20:23
поделиться
  • 1
    +1 для +, указав способ right . Давайте не будем испортить трассировки стека для чего-то вроде этого. – R. Martinho Fernandes 8 November 2009 в 14:54
  • 2
    Да. Если вызывающий абонент должен выполнить основной проект, который использует отражение для выполнения задачи, пусть связь будет ясной. Передайте класс или экземпляр. – CPerkins 8 November 2009 в 15:02
  • 3
    В общем, я бы согласился с вами, но если вы создаете структуру такого рода, она может стать полезной – mfeingold 8 November 2009 в 15:15
  • 4
    +1, единственная причина использовать трассировку стека - в сценарии отладки. – Yishai 8 November 2009 в 15:43
  • 5
    Почему вы все равно говорите о параметре класса? Ему нужен объект типа D, поэтому он может читать значения свойств. Я думаю, что Mark путал Class / Object в любом случае, или есть все static ? – mhaller 8 November 2009 в 16:16

, если вы используете slf4j в качестве вашей системы регистрации приложений. вы можете использовать:

Class<?> source = org.slf4j.helpers.Util.getCallingClass();

Я думаю, что это быстрее, чем новый Exception (). getStackTrace (), поскольку getStackTrace () alaways делает clone stacktrace.

0
ответ дан Fulai Zhang 25 August 2018 в 20:23
поделиться

Может быть, ответ здесь:

public class CallerMain {
public void foo(){
    System.out.println("CallerMain - foo");
    System.out.println(this.getClass());//output- callerMain
}
public static void main(String[] args) {
    A a = new A();
    CallerMain cm = new CallerMain();
    cm.foo();

}

}

class A{
public void foo(){
    System.out.println("A - foo");
    System.out.println(this.getClass());//output- A
}
}
-2
ответ дан Piyush 25 August 2018 в 20:23
поделиться
1
ответ дан quant_dev 25 August 2018 в 20:23
поделиться

Я пробовал это, и он работает хорошо. Это связано с тем, что каждый объект Java имеет доступ к методу getClass (), который возвращает вызов класса и имя метода.

public Logger logger() {
    return Logger.getLogger(getClass().toString());
}

пример использования:

public DBTable(String tableName) {
    this.tableName = tableName;
    loadTableField();
    this.logger().info("done");
}

java.util.logging.Logger;

Feb 01, 2017 11:14:50 PM rmg.data.model.DBTable (init) INFO: done

-1
ответ дан resti 25 August 2018 в 20:23
поделиться
Другие вопросы по тегам:

Похожие вопросы: