Статьи

Имена портативного регистратора с дескрипторами метода Java 7

В Java 7 были представлены дескрипторы методов с классами java.lang.invoke.MethodHandle и java.lang.invoke.MethodHandles . Хорошо-обоснованный Java-разработчик (который я ранее рассмотрел ) охватывает дескрипторы методов в главе 5 (раздел 5.2) и завершает тривиальным, но очень полезным примером того, что можно сделать с помощью дескрипторов методов и именования регистраторов. Я кратко объясню эту идею в этом блоге.

При приобретении регистратора для определенного класса Java разработчик Java обычно использует этот класс для именования регистратора. В Log4j это обычно делается со ссылкой на сам класс. Для java.util.logging это обычно делается со ссылкой на полное имя класса. Хотя это легко сделать, возможно ошибочно предоставить неправильный класс, особенно когда неправильно предоставленный класс находится в том же пакете, и оператор определения регистратора копируется и вставляется из существующего класса в новый класс. Как предполагают авторы The Well-Gounded Java Developer , недавно представленныйMethodHandles class может сделать это объявление более переносимым и всегда контекстуально основанным на классе, в котором находится объявление.

Метод MethodHandes.lookup () возвращает экземпляр MethodHandles.Lookup , из которого может быть вызван метод lookupClass () . Возвращаемое значение Этот последний метод может быть использован непосредственно в обозначении регистратор Log4j или может иметь , что возвращается класс «ы getCanonicalName () метод возвращает его имя как Stringдля наименования java.util.logging регистратора.

Следующие два фрагмента кода показывают это для класса, определяющего его регистратор Log4j, и для класса, определяющего его java.util.loggingрегистратор. Обратите внимание, что в этих примерах содержится больше символов, чем обычно может присутствовать при жестком кодировании класса или имени класса в объявлении регистратора, но этот код гарантирует, что фактический класс или имя класса всегда используется.

MethodHandles Подход к именованию log4j Logger

package dustin.examples.methodhandles;

import java.lang.invoke.MethodHandles;
import org.apache.log4j.Logger;

/**
 * Demonstrating use of MethodHandles with Log4j.
 * 
 * @author Dustin
 */
public class MethodHandlesLoggerLog4j
{
   /** Use Java 7 MethodHandles to get my class for logger. */
   private static final Logger LOGGER = Logger.getLogger(MethodHandles.lookup().lookupClass());

   public static void main(final String[] arguments)
   {
      final String msg = "Hello World: Using MethodHandles for Class to associate with Log4j logger.";
      LOGGER.info(msg);
   }
}

MethodHandles Подход к именованию java.util.logging Logger

package dustin.examples.methodhandles;

import java.lang.invoke.MethodHandles;
import java.util.logging.Logger;

/**
 * Demonstrating use of MethodHandles with java.util.logging.
 * 
 * @author Dustin
 */
public class MethodHandlesLoggerJavaUtilLogging
{
   /** Use Java 7 MethodHandles to get my class name for logger. */
   private static final Logger LOGGER =
           Logger.getLogger(MethodHandles.lookup().lookupClass().getCanonicalName());

   public static void main(final String[] arguments)
   {
      final String msg = "Hello World: Using MethodHandles for Class to associate with java.util.logging logger.";
      LOGGER.info(msg);
   }  
}

В этом посте рассматривается идея очень простого использования недавно доступного класса Java 7 MethodHandles, описанного в статье «Хорошо обоснованный Java-разработчик» . Хотя это небольшая вещь, она иллюстрирует удобное использование менее рекламируемой функции языка Java 7, которая предоставляет гораздо более мощные (и более сложные) варианты использования.