有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java什么是MyClass。班

以下是MainClass中列出的代码。爪哇

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.");
    }
}

库伯德。。。 我觉得这篇文章很有用

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

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

float f = 5.6f ;  //here 5.6f is a float literal

我所知道的唯一的非原始真实是

String str = "java" ;   //"java" is a String litereal

还有类文字,u和Jon Skeet对我很清楚

java中还有更多的文本吗


同意。。。 因此,根据讨论,总文字量分为:-

  • 原始文字
  • 字符串文字
  • 类文字
  • 空的

是否还有一些文字(使列表稍微长一点:)


当我反编译main类时。使用decomipler初始化,两个类 类型静态变量(可能是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...");
    }
}

反编译器生成的代码:-

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;
}

共 (4) 个答案

  1. # 1 楼答案

    对,可以说没有“class”实例变量。事实上,它存在于每一个班级。我的班级。类直接获取MyClass的类实例。我不确定你对反射有多熟悉,但这可以让你开始使用反射。你可以在本教程中找到一些你可以做的例子: http://www.ibm.com/developerworks/library/j-dyn0603/

    反射允许程序在运行时查看和修改自己的行为。这是一种“元编程”

  2. # 2 楼答案

    它是“class literal”——一种获取特定类型的Class<T>的简单方法

    有关更多详细信息,请参见Java语言规范的section 15.8.2

    请注意,它不是类的“字段”,而是一个特殊的语法糖块

    由于类型擦除,您可能会遇到有关泛型的有趣限制。Guice中引入的^{}提供了更多信息和解决方法

    在实现方面,这取决于您针对的字节码版本。如果使用-target 1.4(或更低),对Class.forName()的调用将以静态方法插入代码中,该方法在类型初始化期间调用。如果使用-target 1.5(或更高版本),常量池将获得一个“类”条目。不过,我不知道这是如何处理的细节

  3. # 3 楼答案

    写入MyClass.class会得到类型为Class<MyClass>的对象

    因此,在上面的代码中,如果要正确使用泛型,应该说:

    Class<MyClass> c = MyClass.class;
    

    或者

    Class<?> c = MyClass.class;
    

    class关键字将给出建模类的Class对象

    正如Jon Skeet所提到的,The Java Language Specification中的Section 15.8.2: Class Literals对类literal说了以下几点:

    A class literal is an expression consisting of the name of a class, interface, array, or primitive type, or the pseudo-type void, followed by a '.' and the token class. The type of a class literal, C.Class, where C is the name of a class, interface or array type, is Class<C>.

    A class literal evaluates to the Class object for the named type (or for void) as defined by the defining class loader of the class of the current instance.

  4. # 4 楼答案

    除了其他人已经说过的之外,“MyClass.class”在语义上与:

    Class.forName("MyClass", false, classloader);
    

    其中“classloader”是调用类的classloader实例

    主要区别在于异常处理——上面的代码片段抛出ClassNotFoundException,但我不相信MyClass。类可以抛出它(不过,它可能抛出ClassDefNotFoundError,但这是一个更普遍的问题)。还有,我的班级。类使用导入语句,而。forname()要求您传入完全限定的类名


    正如我被提醒的那样,我的班级。类不会初始化MyClass,因此不会调用静态初始值设定项