一个简单的类加载器URLClassLoader案例

 更新时间:2023年04月06日 10:09:43   作者:CrazyDragon_King  
这篇文章主要介绍了一个简单的类加载器URLClassLoader案例,这里写了一个小 demo,来加深对于反射的理解,需要的朋友可以参考下

类加载器之URLClassLoader的简单demo

最近,看了一点反射相关的知识,感觉Java 的知识还有很多需要学习的,这也是一个很大的挑战吧。
这里写了一个小 demo,来加深对于反射的理解。

public class Test {
	public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException, SecurityException, InstantiationException, IllegalAccessException, IllegalArgumentException, InvocationTargetException, IOException {
		URL[] urls = new URL[] {new URL("http://192.168.119.132:8080/images/animal.jar")};
		URLClassLoader classLoader = new URLClassLoader(urls);
		//加载类以后就可以得到 Class 对象了
		Class<?> clazz = classLoader.loadClass("com.learn.animal.Dog");
		classLoader.close();  //加载完类以后就可以删除了。
		//关闭 classLoader, 否则会造成 资源泄露  Resource leak
		//这里不使用默认的构造器,使用带参数的构造器 获取特殊的构造器
		Constructor<?> con = clazz.getDeclaredConstructor(String.class, int.class, int.class);
		//使用构造器创建对象
		Object ob = con.newInstance("小黑",12,50);
		//在调用 Dog 对象的 say 方法,返回对 Dog 对象自己的描述
		Method mtd0 = clazz.getMethod("say", new Class<?>[] {});  
		String dogSay = (String)mtd0.invoke(ob, new Object[] {});  
		System.out.println(dogSay);
		//再使用setter 方法,改变属性  模拟 Dog 对象,逐渐长大,变胖  哈哈!
		System.out.println("Three years later......");
		Method mtd1 = clazz.getMethod("setAge", int.class);
		mtd1.invoke(ob, 15);
		Method mtd2 = clazz.getMethod("setWeight", int.class);
		mtd2.invoke(ob, 70);
		//注意这些方法是有返回值的!  返回值都是 Object 类型,需要自己强转类型
		dogSay = (String)mtd0.invoke(ob, new Object[] {});  
		System.out.println(dogSay);
		System.out.println("It's over!");
	}
}

这里的 URL 资源,我用的是虚拟机里面的搭建的简单的 nginx 服务器,也是看着别人的教程搭建的,很简陋的一个服务器,哈哈。但是,这里足够使用了,如果没有条件,或者想简单一点,可以使用本地的文件系统。
使用 file:///jar包地址 这个替换就行了。

这里使用的 jar 包也很简单,但是我直接打成了 jar 包,只有 class 文件了,我反编译以下,把代码图片贴出来吧。
这个反编译不是全部代码,但是细节很简单,只有一个 say() 方法,可以参照下面的运行截图,补全。

在这里插入图片描述

然后是运行截图,注意我这里这个 -encoding utf-8 是指定使用编码字符集,因为cmd里面执行代码,如果有中文可能无法通过编译。

运行截图

总结:Java 的 URLClassLoader 简单使用也不是那么复杂,虽然技术本身很复杂,但是学习也不是一蹴而就的,学习也是一个过程,保持进步,继续努力。

到此这篇关于一个简单的类加载器URLClassLoader案例的文章就介绍到这了,更多相关类加载器URLClassLoader案例内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • springboot自定义stater启动流程

    springboot自定义stater启动流程

    这篇文章主要介绍了springboot自定义stater启动流程,本文给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下
    2019-12-12
  • 使用@RequestBody传递多个不同对象方式

    使用@RequestBody传递多个不同对象方式

    这篇文章主要介绍了使用@RequestBody传递多个不同对象方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-10-10
  • SWT(JFace) Menu、Bar...体验代码

    SWT(JFace) Menu、Bar...体验代码

    SWT(JFace)体验之Menu、Bar实现代码。
    2009-06-06
  • Feign如何使用protobuf的类作为参数调用

    Feign如何使用protobuf的类作为参数调用

    这篇文章主要介绍了Feign如何使用protobuf的类作为参数调用,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-03-03
  • Java 字符串转float运算 float转字符串的方法

    Java 字符串转float运算 float转字符串的方法

    今天小编就为大家分享一篇Java 字符串转float运算 float转字符串的方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-07-07
  • 在java上使用亚马逊云储存方法

    在java上使用亚马逊云储存方法

    这篇文章主要介绍了在java上使用亚马逊云储存方法,首先写一个配置类,写一个controller接口调用方法存储文件,本文结合示例代码给大家介绍的非常详细,需要的朋友参考下吧
    2024-01-01
  • java读取resource目录下文件的方法示例

    java读取resource目录下文件的方法示例

    这篇文章主要介绍了利用java读取resource目录下文件的方法,文中给出了详细的示例代码,相信对大家具有一定的参考借鉴,需要的朋友们下面来一起看看吧。
    2017-02-02
  • Java基础之内部类与代理知识总结

    Java基础之内部类与代理知识总结

    今天带大家复习Java的基础知识,文中有非常详细的介绍及图文示例,对正在学习Java的小伙伴们很有帮助,需要的朋友可以参考下
    2021-06-06
  • Spring配置文件的拆分和整合过程分析

    Spring配置文件的拆分和整合过程分析

    在实际应用里,随着应用规模的增加,系统中 Bean 数量也大量增加,导致配置文件非常庞大。为了避免这种情况的产生,提高配置文件的可读性与可维护性,可以将Spring 配置文件分解成多个配置文件,感兴趣的朋友跟随小编一起看看吧
    2022-10-10
  • Java线程中的用户态和内核态解读

    Java线程中的用户态和内核态解读

    这篇文章主要介绍了Java线程中的用户态和内核态解读,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-06-06

最新评论