看了不少关于反射的讲解了,可是只能理解到反射就是动态的获得方法和属性。
xx.class,为什么xx只能是类名而不能是对象,是什么内部机制?
谁能用通俗的话讲解一下?
xx.class到底得到了什么?一个Class? Class c = Class.class;居然说找不到符号!!
为什么Test.class.getResource("")正确
t.getClass().getResource("")也正确
而t.class.getResource("")就不正确?
看了一天了,理解不了。
高手帮忙理解一下吧,眼都快看瞎了。
先睡觉吧,太累了。
希望明天能看到答案,明天来顶。
夜猫子都睡吧,安了Z~z~
------解决方案--------------------
没人顶啊,我也是小白
------解决方案--------------------
Class c = Class.class;改为Class c = Test.class;试试
------解决方案--------------------
你确定?
请看下面:
public static void main(String[] args) {
Test t = new Test();
System.out.println(t.getClass().getResource("/test.txt"));
}
运行结果:
file:/D:/workspace/test/bin/test.txt
检查自己的代码是否有错!!!!!
------解决方案--------------------
你可以这样理解。xx.class是Class对象的static属性。而getClass是对象的实例方法。
------解决方案--------------------
xx.class,为什么xx只能是类名而不能是对象,是什么内部机制?
你反问下:人类与你有什么关系,你是人类,而人类却决不会只有你(当然2012到了),;
上面说明了人类是人的抽象,把人具有的共同特征(这个就不用说了吧)抽象出来用人类来表示;但不同的人具有不同的特征,比如说,人有指纹,但你的指纹和其他人肯定不同,也就是说每个人都是不同的;
人就是对象,人类就是类了,你不能代表人类,而你肯定的属于人类,那就是对象不能代表类,而对象肯定的属于这个类;
xx.class到底得到了什么?一个Class? Class c = Class.class;居然说找不到符号!!
xx.class表示的是类字面值,也指一个Class<xx>实例,表示正在运行的 Java 应用程序中的类和接口();
Class c = Class.class;居然说找不到符号:肯定能找到!相信这点.
Test.class, t.getClass()很容易理解,都是获取Class<Test>的实例,而这个t.class上面说了;
------解决方案--------------------
还有就是:你理解了 反射就是动态的获得方法和属性 这点,也可这样理解:
类会有属性和方法,还有构造方法等,这些都是类的共性(特征),把它们抽象出来,用个Class(类的类)来表示,所以Class的实例肯定是类了;
------解决方案--------------------
假设一个类
class TestClass
{
public TestClass
{
}
static
{
System.out.println("static block is running!);
}
}
java 生成类TestClass的Class引用有三种方法:
1 根据对象,用对象的getClass()方法。
2 用类Class 的静态方法 forName(String className)方法。
3 用类字面常量方法。
第一种方法,因为已经有了类对象了,所以类的静态方法已经初始化了。就不说它了。
后面两种方法,优点是都不用生成TestClass的对象,就获得了类TestClass的Class引用。
第二种方法获得Class引用的同时,初始化静态块。
而第三种方法,不初始化静态块。
后附程序,楼主可以测试一下。
- Java code
/* 这个程序用于测试获得类ClassTest 的Class 引用的3个方法。 * 20120312 * filename :TestGetClass.java */package csdn;public class TestGetClass{ public static void main(String[] args) { System.out.println(" ---------测试第一种方法!------"); TestClass1 testClass1=new TestClass1(); Class classReference1=testClass1.getClass(); System.out.println("classReference1 is "+classReference1); System.out.println(" ---------测试第一种方法结束!------"+"\r\n"); System.out.println(" ---------测试第二种方法!------"); try { Class classReference2=Class.forName("csdn.TestClass2"); //这块要用类的全名。而且要放在try/catch里。 System.out.println("classReference2 is "+classReference2); System.out.println(" ---------测试第二种方法结束!------"+"\r\n"); } catch(ClassNotFoundException e) { e.printStackTrace(); } System.out.println(" ---------测试第三种方法!------"); Class classReference3=TestClass3.class; System.out.println("classReference3 is "+classReference3); System.out.println(" ---------测试第三种方法结束!------"+"\r\n"); }}//---- 用于第一种方法。class TestClass1{ public TestClass1() { System.out.println("TestClass1 is initializing!"); } static { System.out.println("static block1 is running!"); }}//---- 用于第二种方法。class TestClass2{ public TestClass2() { System.out.println("TestClass2 is initializing!"); } static { System.out.println("static block2 is running!"); }}//---- 用于第三种方法。class TestClass3{ public TestClass3() { System.out.println("TestClass3 is initializing!"); } static { System.out.println("static block3 is running!"); }}