-
2008-01-09
ClassLoader学习使用 - [工作学习]
版权声明:转载时请以超链接形式标明文章原始出处和作者信息及本声明
1,ClassLoader的关键 我的目的就是实现一个java版本的plugin机制,能够动态从非classpath的文件目录加载class文件,从而提高程序的可扩展性。比如:我们目前支持cisco,huawei等设备的信息获取,未来我们需要支持juniper等,那么在我们编写好juniper的信息获取程序文件后,只需要将juniper的class文件放在单独的目录,或者单独jar,而不用管这个jar、目录是否在之前设置的classpath中。以前,在c程序中,都是通过dll/so的方式加载的,非常方便的,现在发现java的ClassLoader更加强大,呵呵。 载入一个class到内存,比如从网络,jar,zip,加密的文件等等 public Class<?> loadClass(String name) throws ClassNotFoundException 默认的处理:如果已经加载过,则直接返回;否则,如果有父classloader,则让父classloader进行加载,没有父就让Bootstrap进行加载;如果都加载失败,则调用自身这个ClassLoader的findClass方法。所以覆写findClass是关键。 protected Class<?> findClass(String name) throws ClassNotFoundException 系统默认的ClassLoader的实现:直接抛异常,这就让你的子类必须实现这个类。呵呵 所以,如果要实现自己的ClassLoader,则findClass是关键。这个可以参考java api中的ClassLoader说明。 2,如何编写一个ClassLoader 最简单的就是写一个findClass即可,比如我现在要写一个plugin式的应用,所有监控任务都在d:\temp下,我采用动态加载的方式加载这些任务,这些任务的class文件并没有配置在我们的启动classpath中,这就需要我们自己写一个classloader将这些class加载进来。 findClass很简单:就是先将文件名解析成路径名(.换成/)。然后从文件系统中读取这个class文件,存为byte[] 然后调用父类的defineClass方法。 MyClassLoader.java
http://jimsu.yourblog.org/logs/628237.html
随机文章:
介绍confluene 2008-01-13提高性能:io操作 2005-11-252005国庆长妇幼孕检攻略 2005-10-08mysql client API tips 2005-09-09程序的可移植性:window,linux,aix,solaris下程序移植体会 2005-05-30
收藏到:Del.icio.us





