Я добавляю файл 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
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. Кроме того, этот метод не следует вызывать в первом стеке стека.
foo () является закрытым, поэтому вызывающий объект всегда будет в классе A.
Хакерное решение - sun.reflect.Reflection.getCallerClass
.
public void foo() {
Class<?> caller = sun.reflect.Reflection.getCallerClass();
// ...
}
Это хаки, потому что вы должны убедиться, что класс, вызывающий Reflection.getCallerClass()
, загружен в bootstrap ClassLoader для аннотации @CallerSensitive
(которую getCallerClass
помечен) для работы. Таким образом, это, вероятно, не лучшее решение для проекта, если только ваш проект не использует агент Java , чтобы добавить ваши классы в поиск начальной загрузки ClassLoader.
Самый простой способ заключается в следующем:
String className = new Exception().getStackTrace()[1].getClassName();
Но в реале не должно быть необходимости в этом, если только для некоторых целей ведения журнала, потому что это довольно дорогостоящая задача. Что это, проблема, для которой вы думаете, что это решение? Мы можем придумать -лучшие предложения.
Изменить: вы прокомментировали следующее:
в основном я пытаюсь сделать слой базы данных и в классе A я создам метод, который будет генерировать операторы sql, такие операторы динамически генерируются путем получения значений всех общедоступных свойств вызывающего класса.
blockquote>Затем я настоятельно рекомендую искать существующую библиотеку ORM , такую как Hibernate , iBatis или любая реализация JPA на ваш вкус .
Thread.currentThread().getStackTrace()[0].getMethodName()
всегда "getStackTrace"
. Угадайте, что вы можете понять, почему ...
– R. Martinho Fernandes
8 November 2009 в 15:36
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 */ ); }
, если вы используете slf4j в качестве вашей системы регистрации приложений. вы можете использовать:
Class<?> source = org.slf4j.helpers.Util.getCallingClass();
Я думаю, что это быстрее, чем новый Exception (). getStackTrace (), поскольку getStackTrace () alaways делает clone stacktrace.
Может быть, ответ здесь:
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
}
}
Из трассировки стека: http://www.javaworld.com/javaworld/javatips/jw-javatip124.html
Я пробовал это, и он работает хорошо. Это связано с тем, что каждый объект 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