Spring源码学习之:ClassLoader学习(5)-自测

简介: 【一】测试目的(ClassLoader的作用)1:测试涉及三个jar包,nonbankcard-configure-0.0.1-SNAPSHOT.jar,nonbankcard-persist-0.0.

【一】测试目的(ClassLoader的作用)

1:测试涉及三个jar包,nonbankcard-configure-0.0.1-SNAPSHOT.jar,nonbankcard-persist-0.0.1-SNAPSHOT.jar,fastjson-1.2.8.sec01.jar

2:将这三个jar包放在指定的目录里(/usr/sxf/testcls)

3:在项目中编辑类加载的jar,加载到内存中,执行jar包中的方法

 

【二】测试代码

1:nonbankcard-persist-0.0.1-SNAPSHOT.jar中的代码

 1 package org.nonbankcard.persist;
 2 /**
 3  * 该类会在nonbankcard-configure-0.0.1-SNAPSHOT.jar类中被引用
 4  * @author sxf
 5  *
 6  */
 7 public class SxfApp {
 8     private String name;
 9     private String age;
10     private String dos;
11     public String getName() {
12         return name;
13     }
14     public void setName(String name) {
15         this.name = name;
16     }
17     public String getAge() {
18         return age;
19     }
20     public void setAge(String age) {
21         this.age = age;
22     }
23     public String getDos() {
24         return dos;
25     }
26     public void setDos(String dos) {
27         this.dos = dos;
28     }
29     
30 }
View Code

2:nonbankcard-configure-0.0.1-SNAPSHOT.jar 中的代码

 1 package com.nonbank.sxf.test.cls;
 2 
 3 import java.util.ArrayList;
 4 import java.util.List;
 5 
 6 import org.nonbankcard.persist.SxfApp;
 7 
 8 import com.alibaba.fastjson.JSON;
 9 /**
10  * 该类中的代码引用了
11  * =>nonbankcard-persist-0.0.1-SNAPSHOT.jar中的代码
12  * =>fastjson-1.2.8.sec01.jar中的代码
13  * =>本jar包中的User类
14  * @author sxf
15  *
16  */
17 public class SxfTestUtils {
18 
19     /**
20      * 静态方法
21      * @param list
22      * @return
23      */
24     public static String formatList(List<String> list){
25         List<User> userList=new ArrayList<User>();
26         List<SxfApp> apps=new ArrayList<SxfApp>();
27         for(String str:list){
28             User u=JSON.parseObject(str, User.class);
29             userList.add(u);
30         }
31         for(User usr:userList){
32             System.out.println("SxfTestUtils.formatList()"+usr.getName());
33             System.out.println("SxfTestUtils.formatList()"+usr.getAge());
34             System.out.println("SxfTestUtils.formatList()"+usr.getDos());
35             SxfApp sxfApp=new SxfApp();
36             sxfApp.setName(usr.getName());
37             sxfApp.setAge(usr.getAge());
38             sxfApp.setDos(usr.getDos());
39             apps.add(sxfApp);
40         }
41         
42         StringBuilder builder=new StringBuilder();
43         for(SxfApp app:apps){
44             builder.append("@").append("姓名==>[").append(app.getName()).append("]年龄==>[").append(app.getAge()).append("]");
45             builder.append("喜欢做的事情==>[").append(app.getDos()).append("]");
46         }
47         return builder.toString().substring(1);
48     }
49     
50     /**
51      * 非静态方法
52      * @param list
53      * @return
54      */
55     public String formatEx(List<String> list){
56         List<User> userList=new ArrayList<User>();
57         List<SxfApp> apps=new ArrayList<SxfApp>();
58         for(String str:list){
59             User u=JSON.parseObject(str, User.class);
60             userList.add(u);
61         }
62         for(User usr:userList){
63             System.out.println("SxfTestUtils.formatList()"+usr.getName());
64             System.out.println("SxfTestUtils.formatList()"+usr.getAge());
65             System.out.println("SxfTestUtils.formatList()"+usr.getDos());
66             SxfApp sxfApp=new SxfApp();
67             sxfApp.setName(usr.getName());
68             sxfApp.setAge(usr.getAge());
69             sxfApp.setDos(usr.getDos());
70             apps.add(sxfApp);
71         }
72         
73         StringBuilder builder=new StringBuilder();
74         for(SxfApp app:apps){
75             builder.append("@").append("姓名==>[").append(app.getName()).append("]年龄==>[").append(app.getAge()).append("]");
76             builder.append("喜欢做的事情==>[").append(app.getDos()).append("]");
77         }
78         return builder.toString().substring(1);
79     }
80     
81     /**
82      * 非静态方法
83      * @param str
84      * @return
85      */
86     public String sxf(String str){
87         System.out.println("SxfTestUtils.sxf(aaaaaaaaaaaaaaaaaaaaaaaaaaaa)");
88         return "记载======>"+str;
89     }
90 }
View Code

3:测试类

  1 package org.nonbankcard.commons;
  2 
  3 import java.io.File;
  4 import java.io.FileFilter;
  5 import java.lang.reflect.Constructor;
  6 import java.lang.reflect.InvocationTargetException;
  7 import java.lang.reflect.Method;
  8 import java.net.MalformedURLException;
  9 import java.net.URL;
 10 import java.net.URLClassLoader;
 11 import java.util.ArrayList;
 12 import java.util.List;
 13 
 14 import org.mvel2.util.ThisLiteral;
 15 /**
 16  * 
 17  * @author sxf
 18  *
 19  */
 20 public class SxfTestClass {
 21     
 22     private final String CLASS_NAME="com.nonbank.sxf.test.cls.SxfTestUtils";
 23     //工具类对应的对象
 24     private Object object=null;
 25     //格式化的方法对象,静态。List作为形参
 26     private Method formatListMethod=null;
 27     //非静态的方法对象。List作为形参
 28     private Method formatExMethod=null;
 29     //非静态的方法对象。String作为形参
 30     private Method sxfMehod=null;
 31     
 32     
 33     
 34     
 35     /**
 36      * 构造函数中,加载指定路径的jar包。调用jar包中的方法
 37      * @throws MalformedURLException
 38      * @throws ClassNotFoundException
 39      * @throws NoSuchMethodException
 40      * @throws SecurityException
 41      * @throws InstantiationException
 42      * @throws IllegalAccessException
 43      * @throws IllegalArgumentException
 44      * @throws InvocationTargetException
 45      */
 46     public SxfTestClass() throws MalformedURLException, ClassNotFoundException, NoSuchMethodException, SecurityException, InstantiationException, IllegalAccessException, IllegalArgumentException, InvocationTargetException{
 47         //jar包所在目录
 48         File file=new File("/usr/sxf/testcls");
 49         
 50         //加载目录下所有的jar文件
 51         File[] files=file.listFiles(new FileFilter() {
 52             public boolean accept(File pathname) {
 53                 String name = pathname.getName().toLowerCase();   
 54                 System.out.println("SxfTestClass.enclosing_method()"+name);
 55                  return name.endsWith("jar");   
 56             }
 57         });
 58         //classLoarder加载
 59         URL[] urls = new URL[files.length];     
 60          for(int i = 0; i < files.length; i++) {   
 61               urls[i] = new URL("file",null,files[i].getAbsolutePath());   
 62          }
 63          //将jar包全部加载到classLoader中
 64          ClassLoader classLoader = new URLClassLoader(urls, null);
 65          
 66          //反射生成jar包中的类的对象,和要执行方法的对象
 67          Class cls=classLoader.loadClass(CLASS_NAME);
 68          //构造函数
 69          Constructor constructor    = cls.getConstructor(new Class[]{});
 70          //反射生成对象
 71          this.object=constructor.newInstance(new Object[]{});
 72          //反射生成要执行方法的对象
 73          this.formatListMethod=cls.getDeclaredMethod("formatList",new Class[] {List.class});
 74          this.formatExMethod=cls.getDeclaredMethod("formatEx", new Class[] {List.class});
 75          this.sxfMehod=cls.getDeclaredMethod("sxf",  new Class[] {String.class});
 76          
 77     }
 78 
 79     public static void main(String[] args) throws MalformedURLException, ClassNotFoundException, NoSuchMethodException, SecurityException, InstantiationException, IllegalAccessException, IllegalArgumentException, InvocationTargetException {
 80         SxfTestClass sxfTestClass=new SxfTestClass();
 81         sxfTestClass.testclassLoader();
 82     }
 83     
 84     /**
 85      * 静态,非静态的方法都可被执行
 86      * @throws IllegalAccessException
 87      * @throws IllegalArgumentException
 88      * @throws InvocationTargetException
 89      * 
 90      */
 91     public void testclassLoader() throws IllegalAccessException, IllegalArgumentException, InvocationTargetException{
 92         String a="{'name':'ddd','age':'28','dos':'学些写java代码'}";
 93         String b="{'name':'eee','age':'28','dos':'打篮球'}";
 94         List<String> list=new ArrayList<String>();
 95         list.add(a);
 96         list.add(b);
 97         Object strObject=formatListMethod.invoke(object, list);
 98         System.out.println("SxfTestClass.testclassLoader()"+strObject);
 99         
100         System.out.println("================================");
101         
102         Object strObject2=formatExMethod.invoke(this.object, list);
103         System.out.println("SxfTestClass.testclassLoader()"+strObject2);
104         
105         System.out.println("================================");
106         
107         Object object=sxfMehod.invoke(this.object, "东");
108         System.out.println("SxfTestClass.testclassLoader()"+object);
109         
110     }
111     
112     
113     /**
114      * 
115 测试结果:
116 SxfTestClass.enclosing_method()nonbankcard-configure-0.0.1-snapshot.jar
117 SxfTestClass.enclosing_method()nonbankcard-persist-0.0.1-snapshot.jar
118 SxfTestClass.enclosing_method()fastjson-1.2.8.sec01.jar
119 SxfTestUtils.formatList()ddd
120 SxfTestUtils.formatList()28
121 SxfTestUtils.formatList()学些写java代码
122 SxfTestUtils.formatList()eee
123 SxfTestUtils.formatList()28
124 SxfTestUtils.formatList()打篮球
125 SxfTestClass.testclassLoader()姓名==>[ddd]年龄==>[28]喜欢做的事情==>[学些写java代码]@姓名==>[eee]年龄==>[28]喜欢做的事情==>[打篮球]
126 ================================
127 SxfTestUtils.formatList()ddd
128 SxfTestUtils.formatList()28
129 SxfTestUtils.formatList()学些写java代码
130 SxfTestUtils.formatList()eee
131 SxfTestUtils.formatList()28
132 SxfTestUtils.formatList()打篮球
133 SxfTestClass.testclassLoader()姓名==>[ddd]年龄==>[28]喜欢做的事情==>[学些写java代码]@姓名==>[eee]年龄==>[28]喜欢做的事情==>[打篮球]
134 ================================
135 SxfTestUtils.sxf(aaaaaaaaaaaaaaaaaaaaaaaaaaaa)
136 SxfTestClass.testclassLoader()记载======>东
137 
138      */
139         
140     
141 }
View Code

 

【三】测试结果

1:执行目录必须存在,要调用方法依赖的所有jar包,否则会抛出异常

相关文章
|
6月前
|
搜索推荐 JavaScript Java
基于springboot的儿童家长教育能力提升学习系统
本系统聚焦儿童家长教育能力提升,针对家庭教育中理念混乱、时间不足、个性化服务缺失等问题,构建科学、系统、个性化的在线学习平台。融合Spring Boot、Vue等先进技术,整合优质教育资源,提供高效便捷的学习路径,助力家长掌握科学育儿方法,促进儿童全面健康发展,推动家庭和谐与社会进步。
|
监控 Java 应用服务中间件
微服务——SpringBoot使用归纳——为什么学习Spring Boot
本文主要探讨为什么学习Spring Boot。从Spring官方定位来看,Spring Boot旨在快速启动和运行项目,简化配置与编码。其优点包括:1) 良好的基因,继承了Spring框架的优点;2) 简化编码,通过starter依赖减少手动配置;3) 简化配置,采用Java Config方式替代繁琐的XML配置;4) 简化部署,内嵌Tomcat支持一键式启动;5) 简化监控,提供运行期性能参数获取功能。此外,从未来发展趋势看,微服务架构逐渐成为主流,而Spring Boot作为官方推荐技术,与Spring Cloud配合使用,将成为未来发展的重要方向。
513 0
微服务——SpringBoot使用归纳——为什么学习Spring Boot
|
前端开发 Java 物联网
智慧班牌源码,采用Java + Spring Boot后端框架,搭配Vue2前端技术,支持SaaS云部署
智慧班牌系统是一款基于信息化与物联网技术的校园管理工具,集成电子屏显示、人脸识别及数据交互功能,实现班级信息展示、智能考勤与家校互通。系统采用Java + Spring Boot后端框架,搭配Vue2前端技术,支持SaaS云部署与私有化定制。核心功能涵盖信息发布、考勤管理、教务处理及数据分析,助力校园文化建设与教学优化。其综合性和可扩展性有效打破数据孤岛,提升交互体验并降低管理成本,适用于日常教学、考试管理和应急场景,为智慧校园建设提供全面解决方案。
667 70
|
监控 Java 应用服务中间件
高级java面试---spring.factories文件的解析源码API机制
【11月更文挑战第20天】Spring Boot是一个用于快速构建基于Spring框架的应用程序的开源框架。它通过自动配置、起步依赖和内嵌服务器等特性,极大地简化了Spring应用的开发和部署过程。本文将深入探讨Spring Boot的背景历史、业务场景、功能点以及底层原理,并通过Java代码手写模拟Spring Boot的启动过程,特别是spring.factories文件的解析源码API机制。
504 2
|
8月前
|
设计模式 Java 开发者
如何快速上手【Spring AOP】?从动态代理到源码剖析(下篇)
Spring AOP的实现本质上依赖于代理模式这一经典设计模式。代理模式通过引入代理对象作为目标对象的中间层,实现了对目标对象访问的控制与增强,其核心价值在于解耦核心业务逻辑与横切关注点。在框架设计中,这种模式广泛用于实现功能扩展(如远程调用、延迟加载)、行为拦截(如权限校验、异常处理)等场景,为系统提供了更高的灵活性和可维护性。
1079 0
|
10月前
|
安全 Java 数据库
Spring Boot 框架深入学习示例教程详解
本教程深入讲解Spring Boot框架,先介绍其基础概念与优势,如自动配置、独立运行等。通过搭建项目、配置数据库等步骤展示技术方案,并结合RESTful API开发实例帮助学习。内容涵盖环境搭建、核心组件应用(Spring MVC、Spring Data JPA、Spring Security)及示例项目——在线书店系统,助你掌握Spring Boot开发全流程。代码资源可从[链接](https://pan.quark.cn/s/14fcf913bae6)获取。
1813 3
|
Java Spring
Spring框架的学习与应用
总的来说,Spring框架是Java开发中的一把强大的工具。通过理解其核心概念,通过实践来学习和掌握,你可以充分利用Spring框架的强大功能,提高你的开发效率和代码质量。
280 20
|
监控 JavaScript 数据可视化
建筑施工一体化信息管理平台源码,支持微服务架构,采用Java、Spring Cloud、Vue等技术开发。
智慧工地云平台是专为建筑施工领域打造的一体化信息管理平台,利用大数据、云计算、物联网等技术,实现施工区域各系统数据汇总与可视化管理。平台涵盖人员、设备、物料、环境等关键因素的实时监控与数据分析,提供远程指挥、决策支持等功能,提升工作效率,促进产业信息化发展。系统由PC端、APP移动端及项目、监管、数据屏三大平台组成,支持微服务架构,采用Java、Spring Cloud、Vue等技术开发。
599 7
|
存储 监控 数据可视化
SaaS云计算技术的智慧工地源码,基于Java+Spring Cloud框架开发
智慧工地源码基于微服务+Java+Spring Cloud +UniApp +MySql架构,利用传感器、监控摄像头、AI、大数据等技术,实现施工现场的实时监测、数据分析与智能决策。平台涵盖人员、车辆、视频监控、施工质量、设备、环境和能耗管理七大维度,提供可视化管理、智能化报警、移动智能办公及分布计算存储等功能,全面提升工地的安全性、效率和质量。
339 0