`
黑暗天使
  • 浏览: 95253 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

编写代码从文件系统中加载目标代码,并且运行

    博客分类:
  • java
 
阅读更多

package com.cmw.example.one;
02  
03 import java.io.File;
04 import java.io.FileInputStream;
05 import java.io.FileNotFoundException;
06 import java.io.IOException;
07 import java.lang.reflect.InvocationTargetException;
08 import java.lang.reflect.Method;
09  
10 /**
11  * 文件加载类
12  * 可根据MyFileClassLoader 从文件中动态生成类
13  * @author chengmingwei
14  *
15  */
16 public class MyFileClassLoader extends ClassLoader {
17   
18  private String classPath;
19   
20  @SuppressWarnings("unchecked")
21  public static void main(String[] args) throws ClassNotFoundException, InstantiationException, IllegalAccessException, IllegalArgumentException, InvocationTargetException{
22  MyFileClassLoader fileClsLoader = new MyFileClassLoader();
23  fileClsLoader.setClassPath("E:\\j2ee_proj\\skythink\\WebContent\\WEB-INF\\classes\\");
24  Class cls = fileClsLoader.loadClass("com.cmw.entity.sys.AccordionEntity");
25  Object obj = cls.newInstance();
26  Method[] mthds = cls.getMethods();
27  for(Method mthd : mthds){
28  String methodName = mthd.getName();
29  System.out.println("mthd.name="+methodName);
30  }
31  System.out.println("obj.class="+obj.getClass().getName());
32  System.out.println("obj.class="+cls.getClassLoader().toString());
33  System.out.println("obj.class="+cls.getClassLoader().getParent().toString());
34  }
35   
36  /**
37   * 根据类名字符串从指定的目录查找类,并返回类对象
38   */
39  @Override
40  protected Class<?> findClass(String name) throws ClassNotFoundException {
41  byte[] classData = null;
42  try {
43  classData = loadClassData(name);
44  catch (IOException e) {
45  e.printStackTrace();
46  }
47  return super.defineClass(name, classData, 0, classData.length);
48  }
49   
50  /**
51   * 根据类名字符串加载类 byte 数据流
52   * @param name   类名字符串  例如: com.cmw.entity.SysEntity
53   * @return   返回类文件 byte 流数据
54   * @throws IOException
55   */
56  private byte[] loadClassData(String name) throws IOException{
57  File file = getFile(name);
58  FileInputStream fis = new FileInputStream(file);
59  byte[] arrData = new byte[(int)file.length()];
60  fis.read(arrData);
61  return arrData;
62  }
63   
64  /**
65   * 根据类名字符串返回一个 File 对象
66   * @param name   类名字符串  
67   * @return    File 对象
68   * @throws FileNotFoundException
69   */
70  private File getFile(String name) throws FileNotFoundException {
71  File dir = new File(classPath);
72  if(!dir.exists()) throw new FileNotFoundException(classPath+" 目录不存在!");
73  String _classPath = classPath.replaceAll("[\\\\]""/");
74  int offset = _classPath.lastIndexOf("/");
75  name = name.replaceAll("[.]""/");
76  if(offset != -1 && offset < _classPath.length()-1){
77  _classPath += "/";
78  }
79  _classPath += name +".class";
80  dir = new File(_classPath);
81  if(!dir.exists()) throw new FileNotFoundException(dir+" 不存在!");
82  return dir;
83  }
84  
85  public String getClassPath() {
86  return classPath;
87  }
88  
89  public void setClassPath(String classPath) {
90  this.classPath = classPath;
91  }
92  
93   
94 }
分享到:
评论

相关推荐

    易语言代码目标文件

    易语言的语法规则允许程序员用中文字符编写代码,如使用“取时间戳”这样的命令来获取当前系统的时间戳。时间戳通常用于跟踪事件发生的时间,或者进行基于时间的计算。它表示的是从特定起点(如1970年1月1日)到当前...

    分散加载文件浅释.zip

    在嵌入式系统开发中,分散加载文件(Scatter Loading File)是一种重要的编程技术,它允许程序员将程序的不同部分分配到内存的特定区域,以优化系统资源的利用和提高执行效率。本文将深入探讨分散加载文件的概念、...

    QNX系统中添加自己编译的.so库.zip_QNX .so文件_SO打包_qnx文件_qnx系统g++编译_so库

    6. **修改build配置文件**:为了将自编译的.so库添加到QNX系统,你需要更新构建脚本或Makefile,确保链接器知道新的库位置,并且在运行时能够找到它。可能需要设置-L参数指定库路径,-l参数指定库名。 7. **部署到...

    C# winform 运行前释放令一个文件(或DLL)

    8. **错误处理**:需要注意的是,动态加载DLL需要处理可能出现的找不到文件、版本冲突等错误,因此在编写代码时要加入适当的异常处理。 9. **搜索路径**:在运行时加载DLL时,系统会按照一定的顺序查找DLL。了解这...

    arm映像文件分析及加载过程

    #### 三、ARM映像文件加载运行的应用情况 1. **在没有地址重映射的ARM应用系统中的加载运行情况**: - 在这类系统中,由于地址和空间大小固定,映像文件的加载和运行地址通常是相同的。因此,在编写程序时,需要...

    源代码的转换、加载与运行(系统阐述源代码是怎样再计算机中变为可以执行的程序)

    源代码的转换、加载与运行是编程过程中至关重要的环节,涉及到计算机如何理解并执行程序员编写的高级语言代码。本文将详细解析这个过程,从源代码的预处理开始,经过编译、汇编和链接,最终形成可执行程序,并讨论其...

    玩转易语言:内存加载exe实现高级功能

    内存加载exe技术的核心在于将一个完整的可执行文件(.exe)直接读取到计算机的内存中,并从内存中执行程序,而不是传统的从磁盘加载到内存再执行的方式。这种方法能够在某些场景下提供更快、更安全、更灵活的程序...

    演示如何编写代码注册 tlb 类型库文件(11KB)...

    当您拥有一个TLB文件时,可能是因为您需要创建一个新的COM组件,或者您从某个第三方软件中获取了这个文件,现在需要将其注册到系统中。 在提供的压缩包中,有以下几个文件: 1. **TypeLib.bas**:这是一个Visual ...

    Android根文件系统以及内核镜像

    `rootfs_xk.tar` 文件很可能是一个编译完成的Android根文件系统的tar归档,用于解压到特定的系统分区,以便在目标设备上运行。当开发者进行自定义系统开发或者驱动开发时,他们可能需要修改或替换这个根文件系统,以...

    C#写的驱动加载程序

    在压缩包中的"DriverLoader"文件可能包含以下几个部分:解决方案文件(.sln)、C#源代码文件(.cs)、配置文件(.config)、资源文件(如图标、字符串资源等)以及可能的测试项目或示例代码。 总的来说,这个"C#写...

    嵌入式Linux系统的移植及其根文件系统的实现

    4. **加载文件系统**:将生成的映像文件加载到ramdisk中,并设置为根文件系统。 #### 4.2 使用NFS文件系统进行基本应用程序开发 除了ramdisk,还可以使用NFS(Network File System)作为根文件系统。NFS允许远程...

    dotnet-一个JScript文件的工具用于创建从内存中加载NETv2程序集

    标题中的“dotnet-一个JScript文件的工具用于创建从内存中加载NETv2程序集”指的是一个基于JScript编写的工具,该工具能够帮助开发者在.NET Framework v2环境中动态地从内存中加载程序集。这在某些场景下非常有用,...

    MiniJVM:MiniJVM是用python语言编写的简单Java虚拟机,它可以从文件系统中加载类文件并运行它

    MiniJVMMiniJVM是一款使用python编写的简易JVM,能够从本地加载class文件并且执行绝大多数指令。支持的功能1.从本地磁盘加载class并解析2.支持绝大多数指令集的执行3.支持虚拟机内存分区以及对象的创建4.支持方法的...

    单页面的js文件动态加载组件

    1. **回调函数**:当js文件加载完成时,可以调用一个预先定义的回调函数,确保后续操作在加载完成后执行。例如,使用`fetch`API时,可以监听`then()`和`catch()`中的结果。 2. **Promise**:使用Promise可以优雅地...

    shellcode加载器

    这个shellcode加载器的组合可能是一个用于渗透测试或研究目的的工具,使用者可以通过Python脚本加载和执行加密过的shellcode,并且可以与Cobalt Strike和Metasploit Framework兼容,提高了在目标系统上执行代码的...

    ads 分散加载文件

    通过定制分散加载文件,我们可以控制程序代码、数据和堆栈等在目标硬件内存中的布局,确保程序运行时的效率和稳定性。在ARM7这样的嵌入式平台上,内存资源有限,因此合理分配内存空间显得尤为关键。 在编写...

    ELF文件病毒的分析和编写

    ELF文件病毒是一种针对Linux系统的恶意软件,它利用了ELF(Executable and Linkable Format)文件格式的特性来嵌入自身的代码到合法的可执行文件中。本文将深入探讨ELF文件格式以及如何分析和编写ELF病毒。 首先,...

    Quartus IP 之mif与hex文件创建与使用

    与MIF不同,HEX文件主要用于存储程序代码或配置数据,通常用于编程器或JTAG设备加载到目标系统中。HEX文件包含地址、数据和记录类型信息,可以跨越多个内存区域。例如,一个HEX文件可能包含程序代码、配置数据和其他...

    ARM处理器的分散加载及特殊应用研究

    文件中定义的加载地址和运行地址符号在连接时生成,供启动代码使用,以完成数据从ROM到RAM的迁移。 连接器在处理分散加载时会自动生成预定义的符号变量,这些变量在启动时用于确定代码和数据的加载和运行位置。此外...

Global site tag (gtag.js) - Google Analytics