Что такое литерал класса в Java? - PullRequest
54 голосов
/ 29 января 2010

Из руководства по Java :

Наконец, есть также специальный вид литерала, называемый литерал класса , сформированный путем взятия имени типа и добавления ".class"; например, String.class. Это относится к объекту (типа Class), который представляет сам тип.

Какому типу переменной может быть присвоен этот литерал?

Пожалуйста, приведите небольшой пример, если это возможно.

Ответы [ 10 ]

48 голосов
/ 29 января 2010
Class<String> c = String.class;

Проверьте Javadoc для java.lang.Class, чтобы увидеть, что вы можете сделать с одним из этих маленьких парней - в основном, связанных с отражением

37 голосов
/ 29 января 2010

Чтобы понять это, вы должны понимать, что String является экземпляром (объектом) класса Class . Строковый литерал (например, «Я - строка») - это нотация, представляющая экземпляр (объект) класса String , тогда как литерал класса (например, Hashtable.class) - это нотация, представляющая Экземпляр класса Класс .

21 голосов
/ 29 января 2010

Благодаря другим хорошим ответам здесь, вы знаете, что это такое, но вот типичный пример использования, который также может прояснить:

    private static Logger log = Logger.getLogger(YourClassHere.class);

Как показывает код, это строка, в которой мы инициализируем каркас логирования (в этом примере я использую пакет org.apache.log4j, но принцип распространяется на другие каркасы). Для метода getLogger() требуется литерал класса, поэтому он знает, что именно регистрирует (т.е. класс текущего объекта).

10 голосов
/ 29 января 2010

Согласно JLS

15.8.2 Литералы класса

Литерал класса - это выражение, состоящее из имени класса, интерфейса, массива или типа примитива, за которым следует . и токен class. Тип литерала класса Class. Он оценивает объект Class для именованного типа (или для void), как определено определяющим загрузчиком класса класса текущего экземпляра.

5 голосов
/ 29 января 2010

Некоторые общие применения можно найти в литералах класса в виде токенов типа времени выполнения .

4 голосов
/ 29 января 2010

Сам литерал MyClass. Если вы напишите MyClass.class, вы получите ссылку на объект класса. Если вы пишете new MyClass(), он использует литерал, чтобы получить экземпляр объекта класса, который вы получаете по MyClass.class. Из экземпляра вы получаете тот же объект класса, вызывая myClassInstance.getClass().

Я не уверен на 100%, но сам литерал нельзя присвоить какой-либо переменной. Что вы можете сделать, так это получить имя класса в виде строки и использовать структуру отражения для создания экземпляра.

2 голосов
/ 29 января 2010

В примерах это примерно так:

Class myClass = MyClass.class

или

MyClass.class.getResourceAsStream("config.properties");
1 голос
/ 13 октября 2016

Когда JVM загружает ваши классы приложений, она сохраняет их как java.class.Class объекты.

Итак, обычно в памяти есть несколько экземпляров типа Class, которые представляют ваши классы. Таким образом, вы можете сделать что-то вроде этого:

Class<Bicycle> bicycleClass = Bicycle.class; // returns the object storing your Bicycle class
bicycleClass.getName();  // returns your class name
bicycleClass.getDeclaredMethods();  // returns your (declared) class methods
1 голос
/ 12 марта 2015

Чтобы понять это, вы должны понимать, что String является instance (object) его superclass (parent class) Object.

class String instance (object) 's является значением String literal (например, "I am a string."):

class   |  instance (object) |  literal
------------------------------------------------
String  |  instance_name  =  |  "I am a string."

, тогда как значение class Object '* instance (object) является Class literal - (например, Hashtable.class), которое относится к class Hashtable' s instance (object)

class      |  instance (object) |  literal
------------------------------------------------
Hashtable  |  instance_name     |  Hashtable.
0 голосов
/ 04 апреля 2019
package training;

import java.lang.reflect.Method;

public class Training {

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        Class<Training> myclass = Training.class;
        Method[] myclassarr = myclass.getDeclaredMethods();
        System.out.println(myclass);
        System.out.println(myclass.getName());
        for (int i = 0; i < myclassarr.length; i++) {
            System.out.println(myclassarr[i]);
        }
        System.out.println();
        Class<String> strobj = String.class;
        System.out.println(strobj);
        System.out.println(strobj.getName());
        Method[] strobjarr = strobj.getDeclaredMethods();
        for (int j = 0; j < strobjarr.length; j++) {
            System.out.println(strobjarr[j]);
        }
    }

    public void MethodA() {

    }

    public static void MethodB() {

    }
}

Выход:

class training.Training
training.Training
public static void training.Training.main(java.lang.String[])
public void training.Training.MethodA()
public static void training.Training.MethodB()

class java.lang.String
java.lang.String
public boolean java.lang.String.equals(java.lang.Object)
public java.lang.String java.lang.String.toString()
public int java.lang.String.hashCode()
public int java.lang.String.compareTo(java.lang.String)
public int java.lang.String.compareTo(java.lang.Object)
public int java.lang.String.indexOf(java.lang.String,int)
public int java.lang.String.indexOf(java.lang.String)
public int java.lang.String.indexOf(int,int)
public int java.lang.String.indexOf(int)
static int java.lang.String.indexOf(char[],int,int,char[],int,int,int)
static int java.lang.String.indexOf(char[],int,int,java.lang.String,int)
public static java.lang.String java.lang.String.valueOf(int)
public static java.lang.String java.lang.String.valueOf(long)
public static java.lang.String java.lang.String.valueOf(float)
public static java.lang.String java.lang.String.valueOf(boolean)
public static java.lang.String java.lang.String.valueOf(char[])
public static java.lang.String java.lang.String.valueOf(char[],int,int)
public static java.lang.String java.lang.String.valueOf(java.lang.Object)
public static java.lang.String java.lang.String.valueOf(char)
public static java.lang.String java.lang.String.valueOf(double)
public char java.lang.String.charAt(int)
private static void java.lang.String.checkBounds(byte[],int,int)
public int java.lang.String.codePointAt(int)
public int java.lang.String.codePointBefore(int)
public int java.lang.String.codePointCount(int,int)
public int java.lang.String.compareToIgnoreCase(java.lang.String)
public java.lang.String java.lang.String.concat(java.lang.String)
public boolean java.lang.String.contains(java.lang.CharSequence)
public boolean java.lang.String.contentEquals(java.lang.CharSequence)
public boolean java.lang.String.contentEquals(java.lang.StringBuffer)
public static java.lang.String java.lang.String.copyValueOf(char[])
public static java.lang.String java.lang.String.copyValueOf(char[],int,int)
public boolean java.lang.String.endsWith(java.lang.String)
public boolean java.lang.String.equalsIgnoreCase(java.lang.String)
public static java.lang.String java.lang.String.format(java.util.Locale,java.lang.String,java.lang.Object[])
public static java.lang.String java.lang.String.format(java.lang.String,java.lang.Object[])
public void java.lang.String.getBytes(int,int,byte[],int)
public byte[] java.lang.String.getBytes(java.nio.charset.Charset)
public byte[] java.lang.String.getBytes(java.lang.String) throws java.io.UnsupportedEncodingException
public byte[] java.lang.String.getBytes()
public void java.lang.String.getChars(int,int,char[],int)
void java.lang.String.getChars(char[],int)
private int java.lang.String.indexOfSupplementary(int,int)
public native java.lang.String java.lang.String.intern()
public boolean java.lang.String.isEmpty()
public static java.lang.String java.lang.String.join(java.lang.CharSequence,java.lang.CharSequence[])
public static java.lang.String java.lang.String.join(java.lang.CharSequence,java.lang.Iterable)
public int java.lang.String.lastIndexOf(int)
public int java.lang.String.lastIndexOf(java.lang.String)
static int java.lang.String.lastIndexOf(char[],int,int,java.lang.String,int)
public int java.lang.String.lastIndexOf(java.lang.String,int)
public int java.lang.String.lastIndexOf(int,int)
static int java.lang.String.lastIndexOf(char[],int,int,char[],int,int,int)
private int java.lang.String.lastIndexOfSupplementary(int,int)
public int java.lang.String.length()
public boolean java.lang.String.matches(java.lang.String)
private boolean java.lang.String.nonSyncContentEquals(java.lang.AbstractStringBuilder)
public int java.lang.String.offsetByCodePoints(int,int)
public boolean java.lang.String.regionMatches(int,java.lang.String,int,int)
public boolean java.lang.String.regionMatches(boolean,int,java.lang.String,int,int)
public java.lang.String java.lang.String.replace(char,char)
public java.lang.String java.lang.String.replace(java.lang.CharSequence,java.lang.CharSequence)
public java.lang.String java.lang.String.replaceAll(java.lang.String,java.lang.String)
public java.lang.String java.lang.String.replaceFirst(java.lang.String,java.lang.String)
public java.lang.String[] java.lang.String.split(java.lang.String)
public java.lang.String[] java.lang.String.split(java.lang.String,int)
public boolean java.lang.String.startsWith(java.lang.String,int)
public boolean java.lang.String.startsWith(java.lang.String)
public java.lang.CharSequence java.lang.String.subSequence(int,int)
public java.lang.String java.lang.String.substring(int)
public java.lang.String java.lang.String.substring(int,int)
public char[] java.lang.String.toCharArray()
public java.lang.String java.lang.String.toLowerCase(java.util.Locale)
public java.lang.String java.lang.String.toLowerCase()
public java.lang.String java.lang.String.toUpperCase()
public java.lang.String java.lang.String.toUpperCase(java.util.Locale)
public java.lang.String java.lang.String.trim()
...