61

来自Java 教程

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

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

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

4

10 回答 10

51
Class<String> c = String.class;

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

于 2010-01-29T08:47:17.490 回答
42

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

于 2010-01-29T09:00:54.807 回答
25

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

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

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

于 2010-01-29T09:05:32.940 回答
15

根据Java 语言规范 (JLS)

15.8.2 类文字

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

于 2010-01-29T09:26:06.583 回答
6

在Class Literals as Runtime-Type Tokens中可以找到一些常见的用途。该方法被广泛用于实现观察者模式,正如在此处EventListenerList讨论的那样。该应用程序包括一个示例。ConverterConverterRangeModel

于 2010-01-29T12:35:35.880 回答
5

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

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

于 2010-01-29T09:20:16.753 回答
3

在示例中是这样的:

Class myClass = MyClass.class

或者

MyClass.class.getResourceAsStream("config.properties");
于 2010-01-29T08:47:59.977 回答
1

要理解这一点,您必须了解这Stringinstance (object)它的一个superclass (parent class) Object

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

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

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

class      |  instance (object) |  literal
------------------------------------------------
Hashtable  |  instance_name     |  Hashtable.
于 2015-03-11T21:54:10.120 回答
1

当 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
于 2016-10-13T20:03:23.987 回答
-1
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()
于 2019-04-04T08:45:07.897 回答