以下是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."); } }
thnx coobird …我发现这篇文章很有用。:)
但是,关于litereals,我的知识仅限于:
int i = 5 ; //here 5 is an integer literal float f = 5.6f ; //here 5.6f is a float literal
我知道的唯一非原始的litereal
String str = "java" ; //"java" is a String litereal
和类字面量,你和乔恩·斯基特(Jon Skeet)对我很清楚。
在Java中找到更多的文字了吗???
同意…因此,根据讨论,总字面量归类为:
还有更多的文字(使列表更长一些 :) )
当我使用反编译器反编译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..."); } }
反编译器生成的代码:-
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; }
它是“类文字”-一种获取Class<T>特定类型的简单方法。
Class<T>
有关更多详细信息,请参见Java语言规范的15.8.2节。
请注意,这不是该类的“领域”,而是一块特殊的语法糖。
由于类型擦除,您可能会遇到有关泛型的有趣限制。将TypeLiteral在吉斯推出提供了更多的信息和解决方法。
TypeLiteral
在实现方面,这取决于您要定位的字节码版本。如果使用-target 1.4(或以下),Class.forName()则将在类型初始化期间调用的静态方法中将对的调用插入到代码中。如果使用-target 1.5(或更高版本),则常量池将获得“类”条目。我不知道如何处理这个细节。
-target 1.4
Class.forName()
-target 1.5