手写类加载器演示 自定义加载类 (1) 创建一个新的 java 文件,并将其保存在适当的目录下。 (2) 使用 cmd 命令进入 world class 的父目录,运行 javac 命令生成 .class 文件。 (3) 创建自己定义的 classload 类。 // 继承 ClassLoader 类并覆盖 findclass 方法。 公共类 MyClassloader extends ClassLoader { private String path; private String classloaderName; private ClassLoader; classloaderName. public MyClassloader(String path,String classloaderName){ this. this.classloaderName = classloader
最编程
2024-03-09 10:41:53
...
7、自定义loaderclass
(1)新建一个java文件,保存在相应的目录。
(2)用cmd命令进入到world类的上级目录,运行javac命令,生成.class文件。
(3)创建自己定义的classload类。
//继承ClassLoader类,重写findclass方法。 public class MyClassloader extends ClassLoader { private String path; private String classloaderName; public MyClassloader(String path,String classloaderName){ this.path = path; this.classloaderName = classloaderName; } //用于寻找类文件 @Override public Class findClass(String name){ byte[] b =loadClassData(name); return defineClass(name,b,0,b.length); } public byte[] loadClassData(String name) { name = path + name + ".class"; InputStream in = null; ByteArrayOutputStream out = null; try { in = new FileInputStream(new File(name)); out = new ByteArrayOutputStream(); int i = 0; while ((i = in.read()) != -1){ out.write(i); } } catch (Exception e) { e.printStackTrace(); }finally { try { out.close(); in.close(); } catch (IOException e) { e.printStackTrace(); } } return out.toByteArray(); } }
(4)创建测试类,测试结果。
public class ClassLoderCheck { public static void main(String[] args) throws IllegalAccessException, InstantiationException, ClassNotFoundException { MyClassloader classloader = new MyClassloader("D:/jvm/", "myclasscloderz"); Class c = classloader.loadClass("World"); System.out.println(c.getClassLoader()); System.out.println(c.getClassLoader().getParent()); System.out.println(c.getClassLoader().getParent().getParent()); c.newInstance(); } }
运行结果为:
自定义类加载器的作用:jvm自带的三个加载器只能加载指定路径下的类字节码。如果某个情况下,我们需要加载应用程序之外的类文件呢?比如本地D盘下的,或者去加载网络上的某个类文件,这种情况就可以使用自定义加载器了。
参考网址:cnblogs.com/gdpuzxs/p/7044963.html
原文地址:https://www.cnblogs.com/shenwen/p/11589549.html
下一篇: 深度 JVM (VIII),如加载器