日期:2014-05-20  浏览次数:20777 次

Test.class正确而t.class就找不到符号,为什么不能用对象?
看了不少关于反射的讲解了,可是只能理解到反射就是动态的获得方法和属性。
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!");
     }
}