java中Class和ClassLoader学习笔记

  • Java编译后,每个类生成一个.class文件;相应的,每个类都有一个对应的Class对象。
  • 在运行期间,如果我们要产生某个类的对象,Java虚拟机(JVM)会检查该类型的Class对象是否已被加载。
  • 如果没有被加载,JVM会根据类的名称找到.class文件并加载它。
  • 一旦某个类型的Class对象已被加载到内存,就可以用它来产生该类型的所有对象。
  • 参考博客:
  • http://my.oschina.net/aminqiao/blog/262601
  • http://blog.csdn.net/a379039233/article/details/6158816/

下面的代码片段描述了Class类和ClassLoader类的部分使用方法,供参考。


package com.company;

class MyTest{
    public int mA;

    public MyTest(){
        mA = 0;
    }

}

class MyTest2{

    static {
        System.out.println("首次加载类MyTest2");
    }

    public MyTest2(){System.out.println("创建MyTest2类的一个新对象ing");}
}

class MyTest3{

    static {
        System.out.println("首次加载类MyTest3");
    }

    public MyTest3(){System.out.println("创建MyTest3类的一个新对象ing");}
}

public class Main {

    public static void main(String[] args) throws ClassNotFoundException {

        System.out.println("Class类型基本方法测试");
        try{
            MyTest test = new MyTest();
            Class testClass = test.getClass();
            System.out.println("getPackage().getName()=" + testClass.getPackage().getName());
            System.out.println("testClass.getName()="+testClass.getName());
            System.out.println("testClass.getSimpleName()="+testClass.getSimpleName());
        }catch (Exception e){
            e.printStackTrace();
        }

        System.out.println("Class.forName动态加载类测试");
        try {
            Class test2class = Class.forName("com.company.MyTest2");
            System.out.println("~~bong~~");
            MyTest2 test22 = (MyTest2) test2class.newInstance();

        } catch (InstantiationException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        }

        System.out.println("Class.getClassLoader类加载器测试");
        try{
            Class class0 = Class.forName("com.company.Main");
            ClassLoader classLoader = class0.getClassLoader();
            if(classLoader == null){
                System.out.println("getClassLoader returns null");
            } else {
                System.out.println(classLoader);
                ClassLoader p = classLoader.getParent();
                System.out.println(p);
                System.out.println((p == null) ? "null ptr": p.getParent());
            }
        }catch (Exception e){
            e.printStackTrace();
        }

        System.out.println("ClassLoader加载类测试");
        try{
            Class class0 = Class.forName("com.company.Main");
            ClassLoader classLoader = class0.getClassLoader();
            /***
             * classLoader.loadClass("com.company.MyTest3") 等价于
             * Class.forName("com.company.MyTest3", false, classLoader)
             */
            Class test3class = Class.forName("com.company.MyTest3", true, classLoader);
            System.out.println("--beng--");
            MyTest3 test23 = (MyTest3) test3class.newInstance();
        }catch(Exception e){
            e.printStackTrace();
        }
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值