Project Class Loader

classLoader原理及自定义ClassLoader ClassLoader功能 类的加载 JVM运行的时候,当用到一个类的时候,需要把类字节码文件加载到内存并生成运行时数据结构,其中classLoader的角色必不可少 classLoader加载一个类的时候,会调用其如下方法 public Class<?> loadClass(String name) throws ClassNotFoundException { return... 阅读详情

应用场景:

eclipse插件开发中,插件中的某个动作需要使用当前java工程的classpath。例如在插件需要访问的XML资源文件可能已经打包在某个jar文件中了,而jar文件正好设置在当前工程的classpath中;再例如数据库访问插件,需要调用jdbc驱动,插件本身为了保证体积是不会包含数据库JDBC驱动的,这时可能需要访问当前工程classpath中的JDBC驱动。

 

解决办法:

       因为已知当前工程(IProject),所以可以得到当前的Java工程(IJavaProject),根据IJavaProject可以得到所有的IPackageFragmentRoot,因而可以得到当前classpathURLs,根据这些URL创建URLClassLoader即可。为了使用方便,我们将会把这个过程封装在ProjectClassLoader中,ProjectClassLoader继承了URLClassLoader

 

实现:

 

 

import java.io.File;

import java.net.URL;

import java.net.URLClassLoader;

import java.util.ArrayList;

import java.util.Iterator;

import java.util.List;

 

import org.eclipse.core.resources.IWorkspaceRoot;

import org.eclipse.core.resources.ResourcesPlugin;

import org.eclipse.core.runtime.FileLocator;

import org.eclipse.core.runtime.IPath;

import org.eclipse.jdt.core.IJavaProject;

import org.eclipse.jdt.core.IPackageFragmentRoot;

import org.eclipse.jdt.core.JavaModelException;

 

public class ProjectClassLoader extends URLClassLoader {

 

       public ProjectClassLoader (IJavaProject project) throws JavaModelException  {

              super(getURLSFromProject(project, null), Thread.currentThread().getContextClassLoader());

       }

 

       public ProjectClassLoader (IJavaProject project, URL[] extraUrls) throws JavaModelException  {

              super(getURLSFromProject(project, extraUrls), Thread.currentThread().getContextClassLoader());

       }

 

       private static URL[] getURLSFromProject (IJavaProject project, URL[] extraUrls) throws JavaModelException {

              List<URL> list = new ArrayList<URL>();

              if (null != extraUrls) {

                     for (int i=0; i<extraUrls.length; i++) {

                            list.add(extraUrls[i]);

                     }

              }

             

              IPackageFragmentRoot[] roots = project.getAllPackageFragmentRoots();

 

              IPath installPath = ResourcesPlugin.getWorkspace().getRoot().getLocation();

             

              for (int i=0; i<roots.length; i++) {

                     try {

                            if (roots[i].isArchive()) {

                                   File f = new File(FileLocator.resolve(installPath.append(roots[i].getPath()).toFile().toURL()).getFile());

                                   if(!f.exists()){

                                          f = new File(FileLocator.resolve(roots[i].getPath().makeAbsolute().toFile().toURL()).getFile());

                                   }

                                   list.add(f.toURL());

                            }

                            else {

                    IPath path = roots[i].getJavaProject().getOutputLocation();

                    if (path.segmentCount() > 1) {

                        IWorkspaceRoot root = ResourcesPlugin.getWorkspace().getRoot();

                        path = root.getFolder(path).getLocation();

                        list.add(path.toFile().toURL());

                    }

                    else {

                        path = roots[i].getJavaProject().getProject().getLocation();

                        list.add(path.toFile().toURL());

                    }

                            }

                     }

                     catch (Exception e) {}

              }

             

              URL[] urls = new URL[list.size()];

              int index = 0;

              for (Iterator i=list.iterator(); i.hasNext(); index++) {

                     urls[index] = (URL) i.next();

              }

              return urls;

       }

}

 

 

IJavaProject javaProject = JavaCore.create(project);//IProject à IJavaProject

ProjectClassLoader loader = new ProjectClassLoader(javaProject);

 

 

 

 

Building Commercial-Quality Plug-ins, Second Edition》一书中给出了另外一种实现:

Chapter 20. Advanced Topics/ Plug-in ClassLoaders

public class ProjectClassLoader extends ClassLoader

{

    private IJavaProject project;

 

    public ProjectClassLoader(IJavaProject project) {

       if (project == null || !project.exists() || !project.isOpen())

          throw new IllegalArgumentException("Invalid project");

       this.project = project;

    }

 

    protected Class findClass(String name)

        throws ClassNotFoundException

    {

        byte[] buf = readBytes(name);

        if (buf == null)

           throw new ClassNotFoundException(name);

        return defineClass(name, buf, 0, buf.length);

    }

 

    private byte[] readBytes(String name) {

       IPath rootLoc = ResourcesPlugin

          .getWorkspace().getRoot().getLocation();

       Path relativePathToClassFile =

          new Path(name.replace(".","/") + ".class");

       IClasspathEntry[] entries;

       IPath outputLocation;

       try {

          entries = project.getResolvedClasspath(true);

          outputLocation =

             rootLoc.append(project.getOutputLocation());

       }

       catch (JavaModelException e) {

          FavoritesLog.logError(e);

          return null;

       }

       for (int i = 0; i < entries.length; i++) {

          IClasspathEntry entry = entries[i];

          switch (entry.getEntryKind()) {

 

             case IClasspathEntry.CPE_SOURCE :

                IPath path = entry.getOutputLocation();

                if (path != null)

                   path = rootLoc.append(path);

                else

                   path = outputLocation;

                path = path.append(relativePathToClassFile);

                byte[] buf = readBytes(path.toFile());

                if (buf != null)

                   return buf;

                break;

             case IClasspathEntry.CPE_LIBRARY:

             case IClasspathEntry.CPE_PROJECT:

                // Handle other entry types here.

                break;

 

             default :

                break;

          }

       }

       return null;

   }

 

   private static byte[] readBytes(File file) {

      if (file == null || !file.exists())

         return null;

      InputStream stream = null;

      try {

         stream =

            new BufferedInputStream(

               new FileInputStream(file));

         int size = 0;

         byte[] buf = new byte[10];

         while (true) {

            int count =

               stream.read(buf, size, buf.length - size);

            if (count < 0)

               break;

            size += count;

            if (size < buf.length)

               break;

            byte[] newBuf = new byte[size + 10];

            System.arraycopy(buf, 0, newBuf, 0, size);

            buf = newBuf;

         }

         byte[] result = new byte[size];

         System.arraycopy(buf, 0, result, 0, size);

         return result;

      }

      catch (Exception e) {

         FavoritesLog.logError(e);

         return null;

      }

      finally {

         try {

            if (stream != null)

               stream.close();

         }

         catch (IOException e) {

            FavoritesLog.logError(e);

            return null;

         }

      }

   }

}

 

 

 
MaxEnt物种分布预测中的常见误区与优化技巧:如何提高模型准确率 本文深入探讨了MaxEnt物种分布预测模型从基础应用到精准预测的进阶实践。针对模型准确率提升,文章系统分析了环境变量筛选、模型参数调优、结果批判性解读等核心环节的常见误区,并提供了基于生态位模型原理的深度优化技巧,帮助研究者产出更可靠、可解释的预测结果。 阅读详情

相关推荐

【浅读论文-红外和可见光图像融合-CNN】Infrared and Visible Image Fusion using a Deep Learning Framework

1.这篇是2018年ICPR会议上发表的一篇文章1。博主个人觉得这算比较早期在VIF(红外光和可见光图像融合)中加入了深度学习这一模型的论文。2.这篇文章并不是完全使用深度学习的模型,模型主体在图像分解和融合仍然采用传统的方法,只有其中一个分支在特征提取和重建方面用到了VGG网络。3.论文地址4.代码地址本文提出了基于深度学习框架的一种新算法。本文提出使用下述论文中Image fusion with guided filtering2中的分解方法将源图像分解为基本部分和细节内容。

一枚博鼠的博客 1680

gradle-3-(configure篇)

gradle之configure篇

dbs1215的专栏 1284

eclipse-project-loader:ClassLoder 用于Eclipse项目中资源文件的高效引用

Eclipse 项目加载器 一个用于随时加载 Eclipse 项目资源而无需重新加载项目的 ClassLoader。 它可以通过在Eclipse的调试配置中指定-Djava.system.class.loader=net.chocolapod.eclipseprojectloader.EclipseProjectClassLoader作为vm的运行时参数来使用。 Eclipse 将运行时类路径设置为 Maven 项目布局中的target/classes 。但是src/main/resources等资源目录只有在Eclipse项目重载时才会反映在target/classes ,所以如果在Eclipse外编辑资源文件,每次都需要重载Eclipse项目... 如果找到的 Java 类文件以外的资源位于target/classes ,EclipseProjectClassLoader 会将其视为

drool规则引擎

引入依赖,版本:8.41.0.Final,父级模块已加入版本管理</</</</</</</</</</</</Drools配置类。

WYT11的博客 567

Drools规则引擎

Drools(JBoss Rules )具有一个易于访问企业策略、易于调整以及易于管理的开源业务规则引擎,符合业内标准,速度快、效率高。业务分析师或审核人员可以利用它轻松查看业务规则,从而检验是否已编码的规则执行了所需的业务规则。

Jin的随手笔记 5963

ClassLoader 详解及用途

1. 在Java应用中所有程序都运行在线程里,如果在程序中没有手工设置过ClassLoader,对于一般的java类如下两种方法获得的ClassLoader通常都是同一个   1.1 this.getClass.getClassLoader();   1.2 Thread.currentThread().getContextClassLoader();   方法一得到的Classloa

yang_chj的博客 975

Class not found using the boot class loader; no stack trace available问题的解决

用Android Studio 4.0升级gradle版本后,在debug版本下重复出现这一问题导致闪退,release版本正常 排查了很久,百度上没搜到有用的方案,最后在stackoverflow上找到了可以解决这一问题的方法 仅供参考: 打开multidex: defaultConfig { ...... multiDexEnabled true } dependencies { compile 'com.android.support:multidex:1.

干物 檬的小Blog 3876

Unreal C++集成UnLua:源码编译与自定义Loader实战指南

在游戏开发中,脚本语言与引擎的集成是提升开发效率的关键技术。Lua作为一种轻量级、高性能的脚本语言,通过C API与C++引擎进行交互,其核心原理在于虚拟机和栈机制。这种设计使得Lua能够无缝嵌入到大型项目中,实现逻辑与引擎的分离,从而支持热更新和快速迭代。在Unreal Engine生态中,UnLua插件扮演了桥梁角色,它通过自动生成绑定代码简化了C++与Lua的互操作。然而,在实际工程实践中,直接使用预编译插件常会遇到版本兼容性和调试困难的问题。因此,从源码集成Lua库并编译成为必要选择,这确保了与特定

weixin_33736832的博客 445

SVD-Loader Ghidra实战指南:3步掌握ARM微控制器逆向分析

在嵌入式系统安全研究和固件逆向工程领域,SVD-Loader for Ghidra为分析ARM Cortex-M系列微控制器带来了革命性的效率提升。这个开源工具通过解析SVD文件,自动在Ghidra中生成完整的寄存器映射和外设结构,让逆向工程师能够快速理解硬件架构,显著提升固件分析效率。 ## 🚀 快速部署:从零到实战的3分钟配置 **SVD-Loader**的安装流程异常简洁,即使是Ghi

gitblog_00779的博客 692

Godot Mod Loader 使用教程:3 个步骤为你的 GDScript 游戏装上模组系统

模组(Mod)是延长游戏寿命的利器,但很多独立游戏作者卡在同一个问题上:**不想为了支持玩家自制内容而重构整个项目**。如果你想给 Godot 3.x 或 4.x 的游戏加入模组支持,又不想碰原始游戏文件,那么 [Godot Mod Loader](https://link.gitcode.com/i/793d29673ec84aa8eb737e93bb253a82) 就是一个专门解决这类需求的方

gitblog_00976的博客 388

从配置到部署:Keras-Project-Template全流程实战指南

想要快速构建和训练深度学习模型吗?**Keras-Project-Template**是你的终极解决方案!这个强大的项目模板专为简化Keras深度学习开发流程而设计,让开发者能够专注于模型设计而非繁琐的工程配置。无论你是深度学习新手还是经验丰富的研究者,这个模板都能显著提升你的开发效率。 ## 🚀 为什么选择Keras-Project-Template? 在深度学习项目开发中,我们常常花费大

gitblog_00105的博客 929

Godot Mod Loader 完整上手指南:三步让你的游戏支持自定义模组

你是不是曾经这样想过:某个游戏玩腻了,特别想加点自己的东西,改改数值、换换造型,可惜官方根本没开放模组接口?反过来,作为独立游戏开发者,你是不是也常被玩家追问"什么时候支持模组",却又担心开放源码会泄露核心逻辑? **Godot Mod Loader** 正是为了解决这对矛盾而生的开源模组加载框架。它专为基于 GDScript 的 Godot 游戏(3.x/4.x)设计,让玩家可以把自制模组打包

gitblog_01037的博客 453

Keras-Project-Template扩展教程:如何自定义数据加载器处理复杂数据集

Keras-Project-Template是一个简化使用Keras构建和训练深度学习模型的项目模板,本教程将详细介绍如何通过自定义数据加载器来处理复杂数据集,帮助新手轻松扩展项目功能。 ## 为什么需要自定义数据加载器? 在深度学习项目中,标准数据集往往无法满足实际需求。当你需要处理如医学影像、遥感数据或特定格式的自定义数据集时,内置的数据加载器可能显得力不从心。通过自定义数据加载器,你可以

gitblog_00082的博客 238

Vue-docs-zh-cn终极教程:10个Vue工具插件配置技巧

Vue-docs-zh-cn是Vue.js官方中文文档翻译合集项目,为中文开发者提供了完整的Vue生态系统文档支持。这个项目汇集了Vue核心库及周边工具的中文文档,包括Vue CLI插件、Vue组件编译工具、TypeScript支持等关键工具。对于想要快速上手Vue开发的新手和希望优化项目配置的开发者来说,掌握这些工具插件的配置技巧至关重要。本文将分享10个实用的Vue工具插件配置技巧,帮助你提升

gitblog_00774的博客 867

从0到1掌握Keras-Project-Template架构:BaseModel/BaseTrainer核心组件解析

想要快速构建深度学习项目但总是被重复代码困扰?Keras-Project-Template正是你需要的解决方案!这个Keras项目模板通过BaseModel和BaseTrainer两大核心组件,让深度学习开发变得高效而优雅。无论你是深度学习新手还是经验丰富的开发者,掌握这个模板都能显著提升你的开发效率。 ## 🚀 为什么需要Keras项目模板? 在深度学习项目开发中,我们经常面临以下痛点:

gitblog_00440的博客 705

论热启动,ClassLoad和实现自己ClassLoader的方法

最近做项目的时候发现一个问题,每次修改后端的代码都要重新启动程序,耗时冗长,少则30秒,多则1分钟,而且启动的时候很容易走神。。。 这样下去肯定不利于开发啦。 反观前端的vue框架的热启动程序,可以大大缩减程序启动的时间,于是本菜就特别想琢磨琢磨热启动的那些事。 什么是热启动 热启动英文为 dynamic loading, 是指在程序运行的时候加载类进内存,而不是一般情况下的在编译的时候加载类。拥有热启动的程序,在类变更的情况下,一般会有监听器监听到类变动的情况,然后将监听到的类加载进内存中。 热启动程序是

m0_47912936的博客 313

ClassLoader详解

ClassLoader主要对类的请求提供服务,当JVM需要某类时,它根据名称向ClassLoader要求这个类,然后由ClassLoader返回这个类的class对象。 1.1 几个相关概念ClassLoader负责载入系统的所有Resources(Class,文件,来自网络的字节流等),通过ClassLoader从而将资源载入JVM   每个class都有一个reference,指向自己的Cl

953

利用classloader实现jar包的加载和卸载,实现类的热替换

由于应用局限,一个classloader只加载一个jar包,所以代码为: 这是一个包装类: public class MyClassLoader { @Resource private SystemConfig systemConfig; private final static ConcurrentHashMap&amp;amp;lt;String,MyURLClassLoader...

u011649691的博客 1万+

利用ClassLoader实现动态热布署

最近接触到OSGI,其实我们一直在使用它,它是一种思想一种方法论。而对于JAVA,很久前看深入虚拟机之类的东西,看安全之类的东西,生涩难懂,在达到一定层次的时候其实触类旁通。

不精通则死 2608

类加载器 转载

Java ClassLoader详解   类加载器是 Java 语言的一个创新,也是 Java 语言流行的重要原因之一。它使得 Java 类可以被动态加载到 Java 虚拟机中并执行。类加载器从 JDK 1.0 就出现了,最初是为了满足 Java Applet 的需要而开发出来的。Java Applet 需要从远程下载 Java 类文件到浏览器中并执行。现在类加载器在 Web 容器和 OSGi...

cheer_nice的专栏 307

【6层】5587.6平米混凝土框架结构商务中心(含计算书、建筑结构图).zip毕业设计参考建筑结构CAD计算书土木工程设计图纸资

【6层】5587.6平米混凝土框架结构商务中心(含计算书、建筑结构图).zip毕业设计参考建筑结构CAD计算书土木工程设计图纸资【6层】5587.6平米混凝土框架结构商务中心(含计算书、建筑结构图).zip毕业设计参考建筑结构CAD计算书土木工程设计图纸资【6层】5587.6平米混凝土框架结构商务中心(含计算书、建筑结构图).zip毕业设计参考建筑结构CAD计算书土木工程设计图纸资【6层】5587.6平米混凝土框架结构商务中心(含计算书、建筑结构图).zip毕业设计参考建筑结构CAD计算书土木工程设计图纸资1.合个人学习技术做项目参考合个人学习技术做项目参考2.适合学生做毕业设计项目参考适合学生做毕业设计项目技术参考 3.适合小团队开发项目技术参考适合小团队开发项目技术参考

上一篇: Project Natures
下一篇: MySQL 5.1.x 新特性:EVENT
Dato
博客等级 码龄24年 2粉丝 7原创
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值