在java反射中,我们可以通过 "类名.class" 得到这个某个类的Class实例.
但是一直不了解,为什么可以直接通过类名来方位class属性?我的理解:
在java中只有static方法和属性可以直接被类名访问,但是我们任意定义一个类,都可以调用 类名.class
举例如下:
public class User {
private int id;
private String name; .......getter setter.........
}
以上自定义类User没有继承任何一个类,我也没有定义"static class"属性,同时Object类也没有这个属性.
但是我依然可以测试调用如下:
public static void main(String[] args){
System.out.println(User.class.getName());
}
总结: 为什么可以调用User.class, .class 哪里来的????
但是一直不了解,为什么可以直接通过类名来方位class属性?我的理解:
在java中只有static方法和属性可以直接被类名访问,但是我们任意定义一个类,都可以调用 类名.class
举例如下:
public class User {
private int id;
private String name; .......getter setter.........
}
以上自定义类User没有继承任何一个类,我也没有定义"static class"属性,同时Object类也没有这个属性.
但是我依然可以测试调用如下:
public static void main(String[] args){
System.out.println(User.class.getName());
}
总结: 为什么可以调用User.class, .class 哪里来的????
如果你手写的话还要自己手动编译
“Class” object的取得途径 Java允许我们从多种管道为一个class生成对应的Class object。下图是一份整理。
Class object 诞生管道 示例 运用getClass() 注:每个class 都有此函数 String str = "abc"; Class c1 = str.getClass(); 运用 Class.getSuperclass() Button b = new Button(); Class c1 = b.getClass(); Class c2 = c1.getSuperclass(); 运用static method Class.forName() (最常被使用) Class c1 = Class.forName ("java.lang.String"); Class c2 = Class.forName ("java.awt.Button"); Class c3 = Class.forName ("java.util.LinkedList$Entry"); Class c4 = Class.forName ("I"); 运用 .class 语法 Class c1 = String.class; Class c2 = java.awt.Button.class; Class c3 = Main.InnerClass.class; Class c4 = int.class; Class c5 = int[].class; 运用 primitive wrapper classes 的TYPE 语法
Class c1 = Boolean.TYPE; Class c2 = Byte.TYPE; Class c3 = Character.TYPE; Class c4 = Short.TYPE; Class c5 = Integer.TYPE; Class c6 = Long.TYPE; Class c7 = Float.TYPE; Class c8 = Double.TYPE; Class c9 = Void.TYPE;
每个被加载的类,在jvm中都会有一个Class对象与之相对应,可以理解为每个类都有一个static属性的Class类实例
如果要创建新的对象,直接使用Class对象的局部class.forName就可以了
这个深一点研究就要看JDK是怎么实现的了
我把JDK源码引入也没有找到.class这个,所以就很不解!
我把这个看成SUN公司设计JAVA语言时的定义的一个规范,开发JDK时,按这个规范去实现的,就是你现在看到的。
感觉应该是ClassLoader加载的时候,自动生成的".class"的静态属性.
但是找不到依据,看看还有没有人注意过这个问题.
然后你调用的User.class就是这个啊
System.out.println(User.class.getName())不就是调用自身得方法么?