什么是 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
What is a class literal in Java?
提问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 typeClass
) 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.Class
to 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.
要理解这一点,您必须了解String是Class 类的实例(对象)。字符串文字(例如“我是字符串。”)是表示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.log4j
package, 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.class
you 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 tokenclass
. The type of a class literal isClass
. It evaluates to the Class object for the named type (or forvoid
) 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 String
is an instance (object)
of its superclass (parent class)
Object
.
要了解这一点,您必须了解那String
是instance (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.Class
objects.
当 JVM 加载您的应用程序类时,它会将它们存储为java.class.Class
对象。
So, there are usually several instances of type Class
in 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()