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包,否则会抛出异常

相关文章
|
18天前
|
Java 应用服务中间件 Nacos
Spring Cloud 常用各个组件详解及实现原理(附加源码+实现逻辑图)
Spring Cloud 常用各个组件详解及实现原理(附加源码+实现逻辑图)
31 0
|
21天前
|
监控 数据可视化 安全
一套成熟的Spring Cloud智慧工地平台源码,自主版权,开箱即用
这是一套基于Spring Cloud的智慧工地管理平台源码,具备自主版权,易于使用。平台运用现代技术如物联网、大数据等改进工地管理,服务包括建设各方,提供人员、车辆、视频监控等七大维度的管理。特色在于可视化管理、智能报警、移动办公和分布计算存储。功能涵盖劳务实名制管理、智能考勤、视频监控AI识别、危大工程监控、环境监测、材料管理和进度管理等,实现工地安全、高效的智慧化管理。
|
21小时前
|
Java 应用服务中间件 测试技术
深入探索Spring Boot Web应用源码及实战应用
【5月更文挑战第11天】本文将详细解析Spring Boot Web应用的源码架构,并通过一个实际案例,展示如何构建一个基于Spring Boot的Web应用。本文旨在帮助读者更好地理解Spring Boot的内部工作机制,以及如何利用这些机制优化自己的Web应用开发。
7 2
|
3天前
|
存储 前端开发 Java
Spring Boot自动装配的源码学习
【4月更文挑战第8天】Spring Boot自动装配是其核心机制之一,其设计目标是在应用程序启动时,自动配置所需的各种组件,使得应用程序的开发和部署变得更加简单和高效。下面是关于Spring Boot自动装配的源码学习知识点及实战。
13 1
|
4天前
|
传感器 人工智能 前端开发
JAVA语言VUE2+Spring boot+MySQL开发的智慧校园系统源码(电子班牌可人脸识别)Saas 模式
智慧校园电子班牌,坐落于班级的门口,适合于各类型学校的场景应用,班级学校日常内容更新可由班级自行管理,也可由学校统一管理。让我们一起看看,电子班牌有哪些功能呢?
46 4
JAVA语言VUE2+Spring boot+MySQL开发的智慧校园系统源码(电子班牌可人脸识别)Saas 模式
|
12天前
|
设计模式 安全 Java
【初学者慎入】Spring源码中的16种设计模式实现
以上是威哥给大家整理了16种常见的设计模式在 Spring 源码中的运用,学习 Spring 源码成为了 Java 程序员的标配,你还知道Spring 中哪些源码中运用了设计模式,欢迎留言与威哥交流。
|
13天前
|
XML Java 数据格式
Spring学习__一篇足矣
Spring学习__一篇足矣
Spring学习__一篇足矣
|
16天前
|
Java 数据安全/隐私保护 Sentinel
微服务学习 | Spring Cloud 中使用 Sentinel 实现服务限流
微服务学习 | Spring Cloud 中使用 Sentinel 实现服务限流
|
16天前
|
XML 人工智能 Java
Spring Bean名称生成规则(含源码解析、自定义Spring Bean名称方式)
Spring Bean名称生成规则(含源码解析、自定义Spring Bean名称方式)
|
17天前
|
Java Nacos 开发者
Java从入门到精通:4.2.1学习新技术与框架——以Spring Boot和Spring Cloud Alibaba为例
Java从入门到精通:4.2.1学习新技术与框架——以Spring Boot和Spring Cloud Alibaba为例