什么是 Java 中的类字面量?

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/2160788/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-08-13 04:14:52  来源:igfitidea点击:

What is a class literal in Java?

javaliterals

提问by gameover

From the Java tutorial:

Java 教程

Finally, there's also a special kind of literal called a class literal, formed by taking a type name and appending ".class"; for example, String.class. This refers to the object (of type Class) that represents the type itself.

最后,还有一种特殊的字面量,称为类字面量,由类型名称并附加“ .class”;例如,String.class。这是指Class代表类型本身的(类型)对象。

To what type of variable can this literal be assigned to?

这个文字可以分配给什么类型的变量?

Please give a small example if possible.

如果可能,请举一个小例子。

采纳答案by Steven Schlansker

Class<String> c = String.class;

Check out the Javadoc for java.lang.Classto see what you can do with one of these little guys - mostly related to reflection

查看Javadocjava.lang.Class以了解您可以用这些小家伙中的一个做什么 - 主要与反射有关

回答by PeterMmm

In examples it is someting like that:

在示例中,它是这样的:

Class myClass = MyClass.class

or

或者

MyClass.class.getResourceAsStream("config.properties");

回答by shinkou

To understand that, you have to understand that Stringis an instance (object) of the class Class. A string literal (e.g. "I am a string.") is a notation which represents an instance (object) of the class String, whereas a class literal (e.g. Hashtable.class) is a notation which represents an instance of the class Class.

要理解这一点,您必须了解StringClass 类的实例(对象)。字符串文字(例如“我是字符串。”)是表示String类的实例(对象)的表示法,而类文字(例如 Hashtable.class)是表示Class 类的实例的表示法。

回答by Ben

Thanks to the other good answers here, you know what it is, but here's a typical usage example that may clarify also:

感谢这里的其他好答案,您知道它是什么,但这里有一个典型的使用示例,也可以澄清:

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

As the code suggests, this is a line where we're initialising a logging framework (in this example, I'm using the org.apache.log4jpackage, but the principle extends to other frameworks). The getLogger()method requires a class literal so it knows what it's logging (i.e. the current object's class).

正如代码所示,这是我们初始化日志框架的一行(在本例中,我使用的是org.apache.log4j包,但原理扩展到其他框架)。该getLogger()方法需要一个类文字,因此它知道它正在记录什么(即当前对象的类)。

回答by bertolami

The literal itself is MyClass. If you write MyClass.classyou get a Reference to the class object. If you write new MyClass(), it uses the literal to get you an instance of the class object you get by MyClass.class. From the instance you get the same class object by calling myClassInstance.getClass().

文字本身是MyClass. 如果你写,MyClass.class你会得到一个对类对象的引用。如果您编写new MyClass(),它会使用字面量来为您获取所获得的类对象的实例MyClass.class。从实例中,您可以通过调用myClassInstance.getClass().

I am not 100% sure, but the literal itself cannot be assigned to any variable. What you can do is getting the name of the class as string and use the reflection framework to create an instance.

我不是 100% 确定,但文字本身不能分配给任何变量。您可以做的是将类的名称作为字符串获取并使用反射框架创建一个实例。

回答by stacker

According to the JLS

根据JLS

15.8.2 Class Literals

A class literal is an expression consisting of the name of a class, interface, array, or primitive type followed by a .and the token class. The type of a class literal is Class. It evaluates to the Class object for the named type (or for void) as defined by the defining class loader of the class of the current instance.

15.8.2 类文字

类字面量是一个表达式,由类、接口、数组或原始类型的名称后跟 a.和标记组成class。类文字的类型是Class. 它评估void为由当前实例的类的定义类加载器定义的命名类型(或 for )的 Class 对象。

回答by trashgod

Some common uses may be found in Class Literals as Runtime-Type Tokens.

Class Literals 中可以找到一些常见用途作为 Runtime-Type Tokens

回答by AppTime

To understand that, you have to understand that Stringis an instance (object)of its superclass (parent class)Object.

要了解这一点,您必须了解那Stringinstance (object)superclass (parent class)Object.

class String's instance (object)'s value is a String literal(e.g. "I am a string.") :

class String'sinstance (object)的值是一个String literal(例如"I am a string."):

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

whereas class Object's instance (object)'s value is a Class literal— (e.g. Hashtable.class) which refers to class Hashtable's instance (object)

class Object'sinstance (object)的值是一个Class literal- (例如Hashtable.class),它指的是class Hashtable'sinstance (object)

class      |  instance (object) |  literal
------------------------------------------------
Hashtable  |  instance_name     |  Hashtable.

回答by Emmanuel Osimosu

When the JVM loads your application classes, it stores them as java.class.Classobjects.

当 JVM 加载您的应用程序类时,它会将它们存储为java.class.Class对象。

So, there are usually several instances of type Classin memory that represents your classes. So you can do something like this:

因此,内存中通常有几个类型实例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

回答by Nisrin Dhoondia

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() {

    }
}

Output:

输出:

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()