Java中的类文字是什么?

问题描述 投票:51回答:10

来自Java tutorial

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

这个文字可以分配给哪种类型的变量?

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

java literals
10个回答
48
投票
Class<String> c = String.class;

查看Javadoc for java.lang.Class,了解你可以对这些小家伙做些什么 - 主要与反射有关


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

37
投票

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


21
投票

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

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

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


10
投票

根据the JLS

15.8.2类文字

类文字是一个表达式,由类,接口,数组或基本类型的名称组成,后跟.和令牌class。类文字的类型是Class。它计算为由当前实例的类的定义类加载器定义的命名类型(或void)的Class对象。


5
投票

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


4
投票

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

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


2
投票

在示例中,它是这样的:

Class myClass = MyClass.class

要么

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

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 Objectinstance (object)的价值是Class literal - (例如Hashtable.class)指的是class Hashtableinstance (object)

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

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
© www.soinside.com 2019 - 2024. All rights reserved.