一个简单的类加载器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案例内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Kotlin中常见的List使用示例教程

    Kotlin中常见的List使用示例教程

    filter 就像其本意一样,可以通过 filter 对 Kotlin list 进行过滤,本文重点给大家介绍Kotlin中常见的List使用,感兴趣的朋友一起看看吧
    2023-11-11
  • 使用spring-data-redis中的Redis事务

    使用spring-data-redis中的Redis事务

    这篇文章主要介绍了使用spring-data-redis中的Redis事务,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-07-07
  • MapStruct实体间转换的简单用法

    MapStruct实体间转换的简单用法

    今天小编就为大家分享一篇关于MapStruct实体间转换的简单用法,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2019-03-03
  • Java实现的并发任务处理实例

    Java实现的并发任务处理实例

    这篇文章主要介绍了Java实现的并发任务处理方法,结合实例形式较为详细的分析了基于线程操作并发任务的相关技巧,具有一定参考借鉴价值,需要的朋友可以参考下
    2015-11-11
  • MybatisPlus处理大表查询的实现步骤

    MybatisPlus处理大表查询的实现步骤

    在实际工作中当指定查询数据过大时,我们一般使用分页查询的方式一页一页的将数据放到内存处理,本文主要介绍了MybatisPlus处理大表查询的实现步骤,感兴趣的可以了解一下
    2024-08-08
  • 深入了解java中的逃逸分析

    深入了解java中的逃逸分析

    这篇文章主要介绍了深入了解java中的逃逸分析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-09-09
  • Java基本数据类型与封装类型详解(int和Integer区别)

    Java基本数据类型与封装类型详解(int和Integer区别)

    这篇文章主要介绍了Java基本数据类型与封装类型详解(int和Integer区别) ,需要的朋友可以参考下
    2017-02-02
  • Spring Bean的定义概念和使用

    Spring Bean的定义概念和使用

    这篇文章主要介绍了Spring Bean的定义概念和使用,Spring bean对象是构成应用程序的支柱,也是由Spring IoC容器管理的。bean是一个被实例化,组装,并通过Spring IoC容器所管理的对象。这些bean是由用容器提供的配置元数据创建的
    2023-04-04
  • Java使用GUI实现贪吃蛇游戏详解

    Java使用GUI实现贪吃蛇游戏详解

    小时候经常在诺基亚上玩的一个小游戏-贪吃蛇,你还记得吗?本篇带你重温一下把它实现,做的比较简单,但还是可以玩的.感兴趣的朋友快来看看吧
    2022-05-05
  • 使用maven命令实现下载依赖jar

    使用maven命令实现下载依赖jar

    这篇文章主要介绍了使用maven命令实现下载依赖jar方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-05-05

最新评论