类的动态加载

很多时候我们并不希望所有的类都一次性加载到内存之中,而是在需要的时候再动态的加载进内存。这样会大大的减少内存的使用。java给我们提供了ClassLoader类,我们可以继承它并重写其中的方法实现我们自己的类加载器。
下面就通过一个简单的小例子来了解怎样定义我们自己的类加载器:
1、创建一个类,让这个类继承自ClassLoader类,并重写findClass方法。当然这个方法不用我们手写,之需通过Source-->Override/Implements-->找到findclass-->完成就会自动帮我们生成。其实原理很简单就是通过Class.forName()加载类。
findclass方法的API说明是这样的:

*protected Class<?> findClass(String name)
                  throws ClassNotFoundException使用指定的二进制名称查找类。此方法应该被类加载器的实现重写,该实现按照委托模型来加载类。在通过父类加载器检查所请求的类后,此方法将被 loadClass 方法调用。默认实现抛出一个 ClassNotFoundException。*
import java.lang.reflect.Method;

public class MyClassLoader extends ClassLoader{

    Class cls = null;
    @Override
    protected Class<?> findClass(String name) throws ClassNotFoundException {

        cls = Class.forName("d:/test.class");
        return  cls;
    }

}

在这里只是简单的演示一下使用方法,所以我就直接加载d:/test.class类。

2、有了我们自定义的类加载器,我们就可以在我们需要的时候动态的去加载我们想要加载的类。

package com.pzhu.zj.classloader;

import java.lang.reflect.Method;

public class MyClassLoaderTest {
    public static void main(String[] args) {
        MyClassLoader loader = new MyClassLoader();
        try {
            Class cls = loader.loadClass("Test");
            Object obj = cls.newInstance();//获取该类的对象

            //通过反射调用类里的方法
            Method method = cls.getMethod("fun", new Class[]{});
            method.invoke(obj, null);


        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }

}

下面解释一下代码,Class cls = loader.findclass();获取到类加载器加载的类。然后通过newinstance()方法获取该类的对象,由于是动态加载的,所以我们并不知道它是什么类,所以我们把它的对象向上转型为Object类。
我们加载类无非是想调用类里面的方法。所以后面有关Method的语句是通过反射去调用类里的方法,首先通过getmethod()方法找到该方法。在这个小例子中我定义的fun()方法是无参的。如果有参数通过第二个及以后的参数去设置参数。当然当调用方法的时候也要传入相应的参数。
好了,一个最最简单的类加载器就实现了

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值