如何在Java中自定义一个类加载器示例

  介绍

本篇文章给大家分享的是有关如何在Java中自定义一个类加载器示例,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。

1类加载器类有如下两个关键方法:

loadClass(字符串名称,布尔解决):该方法为类加载器的入口点,根据指定的二进制名称来加载类,系统就是调用类加载器的该方法来获取指定类对应的类对象。

findClass(字符串名称):根据二进制名称来查找类。

如果需要实现自定义的类加载器,可以通过重写以上两个方法来实现,当然我们推荐重写findClass()方法,而不是重写loadClass()方法。

2自定义类加载器常用功能

执行代码前自动验证数字签名。

根据用户提供的密码解密代码,从而可以实现代码混淆器来避免反编译类文件。

根据用户需求来动态地加载类。

根据应用需求把其他数据以字节码的形式加载到应用中。

<强>二实战

1 CompileClassLoader。java

import  . io . *;   import 数组;*;   public  class  CompileClassLoader  extends 类加载器   {//,才能读取一个文件的内容   private 才能byte [], getBytes (String 文件名)   ,,,,throws  IOException   {才能   ,,File  File =, new 文件(文件名);   ,,long  len =, file.length ();   ,,byte [], raw =, new 字节(len (int));   ,,试一试(   ,,,,,FileInputStream  fin =, new  FileInputStream(文件)   ,,{   ,,,,//,一次读取类文件的全部二进制数据   ,,,,int  r =, fin.read(生);   ,,,,如果(r  !=, len)   ,,,,,throw  new  IOException(“无法读取全部文件:“   ,,,,,,,,+,r  +,“, !=,,, +, len);   ,,,,return 原材料;   ,,}   ,,}//,才能定义编译指定Java文件的方法   private 才能;boolean 编译(String  javaFile)   ,,,,throws  IOException   {才能   ,,System.out.println (“CompileClassLoader:正在编译,“   ,,,,,+,javaFile  +,“…“);//,,,调用系统的javac命令   ,,Process  p =, Runtime.getRuntime () .exec (“javac “, +, javaFile);   ,,试一试   ,,{   ,,,,//,其他线程都等待这个线程完成   ,,,,p.waitFor ();   ,,}   ,才能赶上(InterruptedException  ie)   ,,{   ,,,,System.out.println (ie);   ,,}//,,,获取javac线程的退出值   ,,int  ret =, p.exitValue ();   ,,//,返回编译是否成功   ,,return  ret ==, 0;   ,,}//,才能重写类加载器的findClass方法   protected 才能;Class< ?祝辞,findClass (String 名称)   ,,,,throws  ClassNotFoundException   {才能   ,,Class  clazz =,空;   ,,//,将包路径中的点(.)替换成斜线(/)。   ,,String  fileStub =, name.replace(“管理者”,,,“/?;   ,,String  javaFilename =, fileStub  +,“.java";   ,,String  classFilename =, fileStub  +,“.class";   ,,File  javaFile =, new 文件(javaFilename);   ,,File  classFile =, new 文件(classFilename);   ,,//,当指定Java源文件存在,且类文件不存在,或者Java源文件//,,,的修改时间比类文件修改时间更晚,重新编译   ,,如果(javaFile.exists (),,,, (! classFile.exists ()   ,,,,,| |,javaFile.lastModified(),祝辞,classFile.lastModified ()))   ,,{   ,,,,试一试   ,,,,{   ,,,,,//,如果编译失败,或者该类文件不存在   ,,,,,如果(!编译(javaFilename), | |, ! classFile.exists ())   ,,,,,{   ,,,,,,,throw  new  ClassNotFoundException (   ,,,,,,,,,,“ClassNotFoundExcetpion:“, +, javaFilename);   ,,,,,}   ,,,,}   ,,,,catch  (IOException 交货)   ,,,,{   ,,,,,ex.printStackTrace ();   ,,,,}   ,,}   ,,//,如果类文件存在,系统负责将该文件转换成类对象   ,,if  (classFile.exists ())   ,,{   ,,,,试一试   ,,,,{   ,,,,,//,将类文件的二进制数据读入数组   ,,,,,byte [], raw =, getBytes (classFilename);   ,,,,,//,调用类加载器的defineClass方法将二进制数据转换成类对象   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null

如何在Java中自定义一个类加载器示例