Вот другой способ, если вам не нужен высокооптимизированный код:
Class<?> primitive=long.class;
Class<?> boxed=Array.get(Array.newInstance(primitive,1),0).getClass();
System.out.println(primitive.getName());
System.out.println(boxed.getName());
(Редактирование / добавление объяснения)
Сначала нужно было посмотреть, есть ли в Java метод, который дает вам класс-оболочку, когда ему присваивается примитивный тип. Не могу найти.
Затем мы увидели, можно ли в Java создать примитивное значение, когда задают примитивный тип (тогда вы можете каким-то образом получить объект из него). Не могу найти способ сделать это.
Но затем выяснилось, что вы МОЖЕТе Java создать массив примитивных значений, когда ему присваивается примитивный тип. И затем есть метод Java, который дает вам объект типа обертки элемента массива (который является примитивным). Как только у вас есть объект, вы можете получить тип.
Так вот как все это работает:
Метод Array.newInstance () создает массив любого типа, который вы укажете, будь то примитив или объект. В случае объекта все элементы имеют тип объекта, но инициализируются нулем. В случае примитива элементы имеют примитивный тип. Но элемент переменной / массива примитива не может быть нулевым, поэтому он имеет значение по умолчанию типа примитива, например, Int будет ноль. Таким образом, никакие элементы не будут нулевыми. И теперь, если вы попытаетесь получить значение элемента с помощью Array.get (), у Array.get () нет другого выбора, кроме как приписать это примитивное значение объекту, например int в Integer, потому что Array.get () не может возвращать примитивное значение. Теперь у вас есть объект типа бокса (обтекания) вашего оригинального примитивного типа. Наконец, вызов Object.getClass () дает вам тип упаковки (обтекания).
Этот трюк работает с любым примитивным типом, который есть в Java сегодня и в будущем.