【问题标题】:What is a class literal in Java?Java中的类文字是什么?
【发布时间】:2022-01-14 10:24:35
【问题描述】:

来自Java tutorial

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

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

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

【问题讨论】:

    标签: java literals


    【解决方案1】:
    Class<String> c = String.class;
    

    查看Javadoc for java.lang.Class,看看你能用这些小家伙做些什么——主要与反射有关

    【讨论】:

      【解决方案2】:

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

      【讨论】:

      • @shinkou String 是类Class的一个实例(对象)。怎么来的?应该是“String.class 是类 Class 的实例(对象)”吧?
      • @Ani String 本身也是类 Class 的一个实例,它被分配了类文字 String.class。想想String str = "I am a string";,其中str 被分配了一个字符串文字“我是一个字符串”。
      • String 本身不是 Class 类的实例。它有一个文字String.class,它是Class&lt;String&gt; 的一个实例。如果它是Class 类型的实例,那么String.class 将是Class&lt;Class&gt; 的实例。 String 不是任何事物的实例。
      • @LewBloch 我省略了.class 试图让事情更容易理解。毕竟,类文字没有它的类型就不能做任何事情。
      • @shinkou,无论出于何种动机,不正确的陈述都不会“让事情更容易理解”。 Au contraire,它们会引起误解和混乱。不要散布谎言。
      【解决方案3】:

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

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

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

      【讨论】:

      • 这比引用 JavaDocs 或其他定义要有用大约 1000 倍;谢谢!
      【解决方案4】:

      根据Java Language Specification (JLS)

      15.8.2 类文字

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

      【讨论】:

        【解决方案5】:

        一些常见的用法可以在Class Literals as Runtime-Type Tokens 中找到。该方法被广泛用于实现observer pattern,如EventListenerList 中所见,讨论hereConverter 应用程序在 ConverterRangeModel 中包含一个示例。

        【讨论】:

          【解决方案6】:

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

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

          【讨论】:

          • 当然可以。如果没有,您将无法将其作为参数传递给函数。文字的类型是 Class ,可以分配给该类型的引用。
          • 字面量本身并不是类名。根据docs.oracle.com/javase/specs/jls/se8/html/…,类文字是标记class。来自 JLS:“类文字是由类、接口、数组或原始类型或伪类型 void 的名称组成的表达式,后跟一个 '。'和令牌类。”注意不是类名,而是.class后跟的名称。
          【解决方案7】:

          在例子中是这样的:

          Class myClass = MyClass.class
          

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

          【讨论】:

            【解决方案8】:

            要了解这一点,您必须了解String 是其superclass (parent class) Objectinstance (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.
            

            【讨论】:

            • String 不是任何事物的实例,当然也不是任何超类的实例。
            【解决方案9】:

            当 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
            

            【讨论】:

              【解决方案10】:
              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()
              

              【讨论】:

              • 我刚刚回答了这个人在问题中提出的问题。 “这个文字可以分配给什么类型的变量?如果可能,请举一个小例子。”
              • 我只是发布代码的错误。请在下面的链接中找到有关 - Java 中的类文字的更多详细信息。 linkedin.com/pulse/details-class-literal-java-nisrin-dhoondia
              猜你喜欢
              • 1970-01-01
              • 2021-04-19
              • 1970-01-01
              • 2012-01-02
              • 2016-08-01
              • 2010-12-19
              • 2021-02-01
              • 2015-05-28
              • 2015-09-12
              相关资源
              最近更新 更多