类名.class, class.forName(), getClass()区别及Class.getResource和ClassLoader.getResource获取路径

Class对象生成方法:

1.类名.class           说明: JVM将使用类装载器, 将类装入内存(前提是:类还没有装入内存),不做类的初始化工作.返回Class的对象

 

2.Class.forName("类名字符串")  (注:类名字符串是包名+类名)  说明:装入类,并做类的静态初始化,返回Class的对象

 

3.实例对象.getClass()  说明:对类进行静态初始化、非静态初始化;返回引用运行时真正所指的对象(因为:子对象的引用可能会赋给父对象的引用变量中)所属的类的Class的对象

通过下面的程序,来观察一下Class对象的生成的原理。

 

  1. package ClassTest;  
  2.   
  3. public class TestClass {  
  4.     public static void main(String[] args) {  
  5.   
  6.         try {  
  7.             // 测试.class 打印结果  testTypeForName---class TestClassType
  8.             @SuppressWarnings("rawtypes")  
  9.             Class testTypeClass = TestClassType.class;  
  10.             System.out.println("testTypeClass---" + testTypeClass);  
  11.   
  12.             // 测试Class.forName()  
  13.             @SuppressWarnings("rawtypes")  
  14.             Class testTypeForName = Class.forName("ClassTest.TestClassType");  
  15.             System.out.println("testTypeForName---" + testTypeForName);
  16.              /*打印结果
  17.                    ---静态的参数初始化---
                       testTypeForName---class TestClassType
  18.             */
  19.  
  20.   
  21.             // 测试Object.getClass()  
  22.             TestClassType testTypeGetClass = new TestClassType();  
  23.             System.out.println("testTypeGetClass---"  
  24.                     + testTypeGetClass.getClass());  
  25.                 /*打印结果
  26.              ---静态的参数初始化---
                 ----非静态的参数初始化---
                 ----构造函数---
                  testTypeGetClass---class TestClassType
  27.             */
  28.         } catch (ClassNotFoundException e) {  
  29.             // TODO Auto-generated catch block  
  30.             e.printStackTrace();  
  31.         }  
  32.     }  
  33.   
  34. }  

  1. package ClassTest;  
  2.   
  3. public class  TestClassType {  
  4.   
  5.     // 构造函数  
  6.     public TestClassType() {  
  7.         System.out.println("----构造函数---");  
  8.     }  
  9.   
  10.     // 静态的参数初始化  
  11.     static {  
  12.         System.out.println("---静态的参数初始化---");  
  13.     }  
  14.   
  15.     // 非静态的参数初始化  
  16.     {  
  17.         System.out.println("----非静态的参数初始化---");  
  18.     }  
  19.   
  20. }  

Java中取资源时,经常用到Class.getResource和ClassLoader.getResource,这里来看看他们在取资源文件时候的路径问题。

Class.getResource(String path)

path不以’/'开头时,默认是从此类所在的包下取资源;
path  以’/'开头时,则是从ClassPath根下获取;

System.out.println(TestMain.class.getResource(""));
        System.out.println(TestMain.class.getResource("/"));

输出结果:

file:/E:/workspace/Test/bin/testpackage/
file:/E:/workspace/Test/bin/

Class.getClassLoader().getResource(String path)

path不能以’/'开头时;
path是从ClassPath根下获取;

还是先看一下下面这段代码的输出:

package testpackage;
public class TestMain {
    public static void main(String[] args) {
        TestMain t = new TestMain();
        System.out.println(t.getClass());
        System.out.println(t.getClass().getClassLoader());
        System.out.println(t.getClass().getClassLoader().getResource(""));
        System.out.println(t.getClass().getClassLoader().getResource("/"));//null
    }
}

输出结果:

class testpackage.TestMain
sun.misc.Launcher$AppClassLoader@1fb8ee3
file:/E:/workspace/Test/bin/
null



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值