什么是MyClass.class?

mog*_*gli 0 java

以下是MainClass.java中列出的代码.

public class MainClass {

    public static void main(String[] args) {

        System.out.println("main started...");

        Class c = MyClass.class ;
                        //this class variable seems to be public static.
                        //But, as it is clearly visible in the MyClass,
                        //no reference variable is declared.
                        //My problem is that from where this class variable
                        //came from.
                        //i also check out the Object.java file, but it also don't
                        //have any public static class variable of Class class
                        //like there is
                        //out (instance of PrintStream class) in System class.
                        //Hope all u mindoverflow guys help me to sort out
                        //this probz.

        try {
            Class.forName( c.getName() ) ;

            System.out.println("classloader of MyClass : " + MyClass.class.getClassLoader());

            System.out.println("classloader of MyClass : " + String.class.getClassLoader());
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }

        System.out.println("main ended...");
    }
}

class MyClass{
    static{
        System.out.println("static block of MyClass class.");
    }
}
Run Code Online (Sandbox Code Playgroud)

thnx coobird ...我觉得这篇文章很有用.:)

但是,关于文学,我的知识仅限于:

int i = 5 ;  //here 5 is an integer literal

float f = 5.6f ;  //here 5.6f is a float literal
Run Code Online (Sandbox Code Playgroud)

我知道唯一的非原始文化

String str = "java" ;   //"java" is a String litereal
Run Code Online (Sandbox Code Playgroud)

你和Jon Skeet非常清楚地告诉我这一点.

是否有更多的文字在java中找到???


同意......所以根据讨论,总文字被归类为: -

  • 原始文字
  • 字符串文字
  • 班级文字
  • 空值

是否有更多的文字(使列表更长一点:))


当我使用decomipler反编译MainClass.class时,会发现两个Class类型的静态变量(可能是coz,我已经使用了2次类文字)被自动添加,但从未发现在代码中使用过.此外,两个类文字都直接替换为我在java文件中使用它们的类文件.

我的代码: -

public class MainClass {

    public static void main(String[] args) {

        System.out.println("main started...");

        Class c = MyClass.class ;

        try {
            Class.forName( c.getName() ) ;

            System.out.println("classloader of MyClass : " + MyClass.class.getClassLoader());

            System.out.println("classloader of MyClass : " + String.class.getClassLoader());
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }

        System.out.println("main ended...");
    }
}
Run Code Online (Sandbox Code Playgroud)

反编译生成的代码: -

import java.io.PrintStream;

public class MainClass
{

    public MainClass()
    {
    }

    public static void main(String args[])
    {
        System.out.println("main started...");
        Class c = MyClass;
        try
        {
            Class.forName(c.getName());
            System.out.println((new StringBuilder("classloader of MyClass : ")).append(MyClass.getClassLoader()).toString());
            System.out.println((new StringBuilder("classloader of MyClass : ")).append(java/lang/String.getClassLoader()).toString());
        }
        catch(ClassNotFoundException e)
        {
            e.printStackTrace();
        }
        System.out.println("main ended...");
    }

    static Class class$0;
    static Class class$1;
}
Run Code Online (Sandbox Code Playgroud)

Jon*_*eet 9

它是"类文字" - 获取Class<T>特定类型的简单方法.

有关更多详细信息,请参阅Java语言规范的第15.8.2节.

请注意,它不是该类的"字段",它是一种特殊的语法糖.

由于类型擦除,您可能会遇到有关泛型的有趣限制.将TypeLiteral在吉斯推出提供了更多的信息和解决方法.

在实现方面,它取决于您要定位的字节码版本.如果使用-target 1.4(或以下),Class.forName()则会在类型初始化期间调用的静态方法中将调用插入到代码中.如果您使用-target 1.5(或以上)常量池获取"类"条目.我不知道如何处理这个细节.

  • @Michael:是的,除了C#支持泛型相当好:) (2认同)