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;
}
# 1 楼答案
对,可以说没有“class”实例变量。事实上,它存在于每一个班级。我的班级。类直接获取MyClass的类实例。我不确定你对反射有多熟悉,但这可以让你开始使用反射。你可以在本教程中找到一些你可以做的例子: http://www.ibm.com/developerworks/library/j-dyn0603/
反射允许程序在运行时查看和修改自己的行为。这是一种“元编程”
# 2 楼答案
它是“class literal”——一种获取特定类型的
Class<T>
的简单方法有关更多详细信息,请参见Java语言规范的section 15.8.2
请注意,它不是类的“字段”,而是一个特殊的语法糖块
由于类型擦除,您可能会遇到有关泛型的有趣限制。Guice中引入的^{} 提供了更多信息和解决方法
在实现方面,这取决于您针对的字节码版本。如果使用
-target 1.4
(或更低),对Class.forName()
的调用将以静态方法插入代码中,该方法在类型初始化期间调用。如果使用-target 1.5
(或更高版本),常量池将获得一个“类”条目。不过,我不知道这是如何处理的细节# 3 楼答案
写入
MyClass.class
会得到类型为Class<MyClass>
的对象因此,在上面的代码中,如果要正确使用泛型,应该说:
或者
class
关键字将给出建模类的Class
对象正如Jon Skeet所提到的,The Java Language Specification中的Section 15.8.2: Class Literals对类literal说了以下几点:
# 4 楼答案
除了其他人已经说过的之外,“MyClass.class”在语义上与:
其中“classloader”是调用类的classloader实例
主要区别在于异常处理——上面的代码片段抛出ClassNotFoundException,但我不相信MyClass。类可以抛出它(不过,它可能抛出ClassDefNotFoundError,但这是一个更普遍的问题)。还有,我的班级。类使用导入语句,而。forname()要求您传入完全限定的类名
正如我被提醒的那样,我的班级。类不会初始化MyClass,因此不会调用静态初始值设定项