Spring源码学习之:ClassLoader学习(5)-自测
【一】测试目的(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中的代码
package org.nonbankcard.persist;
/**
* 该类会在nonbankcard-configure-0.0.1-SNAPSHOT.jar类中被引用
* @author sxf
*
*/
public class SxfApp {
private String name;
private String age;
private String dos;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getAge() {
return age;
}
public void setAge(String age) {
this.age = age;
}
public String getDos() {
return dos;
}
public void setDos(String dos) {
this.dos = dos;
} }
2:nonbankcard-configure-0.0.1-SNAPSHOT.jar 中的代码
package com.nonbank.sxf.test.cls; import java.util.ArrayList;
import java.util.List; import org.nonbankcard.persist.SxfApp; import com.alibaba.fastjson.JSON;
/**
* 该类中的代码引用了
* =>nonbankcard-persist-0.0.1-SNAPSHOT.jar中的代码
* =>fastjson-1.2.8.sec01.jar中的代码
* =>本jar包中的User类
* @author sxf
*
*/
public class SxfTestUtils { /**
* 静态方法
* @param list
* @return
*/
public static String formatList(List<String> list){
List<User> userList=new ArrayList<User>();
List<SxfApp> apps=new ArrayList<SxfApp>();
for(String str:list){
User u=JSON.parseObject(str, User.class);
userList.add(u);
}
for(User usr:userList){
System.out.println("SxfTestUtils.formatList()"+usr.getName());
System.out.println("SxfTestUtils.formatList()"+usr.getAge());
System.out.println("SxfTestUtils.formatList()"+usr.getDos());
SxfApp sxfApp=new SxfApp();
sxfApp.setName(usr.getName());
sxfApp.setAge(usr.getAge());
sxfApp.setDos(usr.getDos());
apps.add(sxfApp);
} StringBuilder builder=new StringBuilder();
for(SxfApp app:apps){
builder.append("@").append("姓名==>[").append(app.getName()).append("]年龄==>[").append(app.getAge()).append("]");
builder.append("喜欢做的事情==>[").append(app.getDos()).append("]");
}
return builder.toString().substring(1);
} /**
* 非静态方法
* @param list
* @return
*/
public String formatEx(List<String> list){
List<User> userList=new ArrayList<User>();
List<SxfApp> apps=new ArrayList<SxfApp>();
for(String str:list){
User u=JSON.parseObject(str, User.class);
userList.add(u);
}
for(User usr:userList){
System.out.println("SxfTestUtils.formatList()"+usr.getName());
System.out.println("SxfTestUtils.formatList()"+usr.getAge());
System.out.println("SxfTestUtils.formatList()"+usr.getDos());
SxfApp sxfApp=new SxfApp();
sxfApp.setName(usr.getName());
sxfApp.setAge(usr.getAge());
sxfApp.setDos(usr.getDos());
apps.add(sxfApp);
} StringBuilder builder=new StringBuilder();
for(SxfApp app:apps){
builder.append("@").append("姓名==>[").append(app.getName()).append("]年龄==>[").append(app.getAge()).append("]");
builder.append("喜欢做的事情==>[").append(app.getDos()).append("]");
}
return builder.toString().substring(1);
} /**
* 非静态方法
* @param str
* @return
*/
public String sxf(String str){
System.out.println("SxfTestUtils.sxf(aaaaaaaaaaaaaaaaaaaaaaaaaaaa)");
return "记载======>"+str;
}
}
3:测试类
package org.nonbankcard.commons; import java.io.File;
import java.io.FileFilter;
import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLClassLoader;
import java.util.ArrayList;
import java.util.List; import org.mvel2.util.ThisLiteral;
/**
*
* @author sxf
*
*/
public class SxfTestClass { private final String CLASS_NAME="com.nonbank.sxf.test.cls.SxfTestUtils";
//工具类对应的对象
private Object object=null;
//格式化的方法对象,静态。List作为形参
private Method formatListMethod=null;
//非静态的方法对象。List作为形参
private Method formatExMethod=null;
//非静态的方法对象。String作为形参
private Method sxfMehod=null; /**
* 构造函数中,加载指定路径的jar包。调用jar包中的方法
* @throws MalformedURLException
* @throws ClassNotFoundException
* @throws NoSuchMethodException
* @throws SecurityException
* @throws InstantiationException
* @throws IllegalAccessException
* @throws IllegalArgumentException
* @throws InvocationTargetException
*/
public SxfTestClass() throws MalformedURLException, ClassNotFoundException, NoSuchMethodException, SecurityException, InstantiationException, IllegalAccessException, IllegalArgumentException, InvocationTargetException{
//jar包所在目录
File file=new File("/usr/sxf/testcls"); //加载目录下所有的jar文件
File[] files=file.listFiles(new FileFilter() {
public boolean accept(File pathname) {
String name = pathname.getName().toLowerCase();
System.out.println("SxfTestClass.enclosing_method()"+name);
return name.endsWith("jar");
}
});
//classLoarder加载
URL[] urls = new URL[files.length];
for(int i = 0; i < files.length; i++) {
urls[i] = new URL("file",null,files[i].getAbsolutePath());
}
//将jar包全部加载到classLoader中
ClassLoader classLoader = new URLClassLoader(urls, null); //反射生成jar包中的类的对象,和要执行方法的对象
Class cls=classLoader.loadClass(CLASS_NAME);
//构造函数
Constructor constructor = cls.getConstructor(new Class[]{});
//反射生成对象
this.object=constructor.newInstance(new Object[]{});
//反射生成要执行方法的对象
this.formatListMethod=cls.getDeclaredMethod("formatList",new Class[] {List.class});
this.formatExMethod=cls.getDeclaredMethod("formatEx", new Class[] {List.class});
this.sxfMehod=cls.getDeclaredMethod("sxf", new Class[] {String.class}); } public static void main(String[] args) throws MalformedURLException, ClassNotFoundException, NoSuchMethodException, SecurityException, InstantiationException, IllegalAccessException, IllegalArgumentException, InvocationTargetException {
SxfTestClass sxfTestClass=new SxfTestClass();
sxfTestClass.testclassLoader();
} /**
* 静态,非静态的方法都可被执行
* @throws IllegalAccessException
* @throws IllegalArgumentException
* @throws InvocationTargetException
*
*/
public void testclassLoader() throws IllegalAccessException, IllegalArgumentException, InvocationTargetException{
String a="{'name':'ddd','age':'28','dos':'学些写java代码'}";
String b="{'name':'eee','age':'28','dos':'打篮球'}";
List<String> list=new ArrayList<String>();
list.add(a);
list.add(b);
Object strObject=formatListMethod.invoke(object, list);
System.out.println("SxfTestClass.testclassLoader()"+strObject); System.out.println("================================"); Object strObject2=formatExMethod.invoke(this.object, list);
System.out.println("SxfTestClass.testclassLoader()"+strObject2); System.out.println("================================"); Object object=sxfMehod.invoke(this.object, "东");
System.out.println("SxfTestClass.testclassLoader()"+object); } /**
*
测试结果:
SxfTestClass.enclosing_method()nonbankcard-configure-0.0.1-snapshot.jar
SxfTestClass.enclosing_method()nonbankcard-persist-0.0.1-snapshot.jar
SxfTestClass.enclosing_method()fastjson-1.2.8.sec01.jar
SxfTestUtils.formatList()ddd
SxfTestUtils.formatList()28
SxfTestUtils.formatList()学些写java代码
SxfTestUtils.formatList()eee
SxfTestUtils.formatList()28
SxfTestUtils.formatList()打篮球
SxfTestClass.testclassLoader()姓名==>[ddd]年龄==>[28]喜欢做的事情==>[学些写java代码]@姓名==>[eee]年龄==>[28]喜欢做的事情==>[打篮球]
================================
SxfTestUtils.formatList()ddd
SxfTestUtils.formatList()28
SxfTestUtils.formatList()学些写java代码
SxfTestUtils.formatList()eee
SxfTestUtils.formatList()28
SxfTestUtils.formatList()打篮球
SxfTestClass.testclassLoader()姓名==>[ddd]年龄==>[28]喜欢做的事情==>[学些写java代码]@姓名==>[eee]年龄==>[28]喜欢做的事情==>[打篮球]
================================
SxfTestUtils.sxf(aaaaaaaaaaaaaaaaaaaaaaaaaaaa)
SxfTestClass.testclassLoader()记载======>东 */ }
【三】测试结果
1:执行目录必须存在,要调用方法依赖的所有jar包,否则会抛出异常
Spring源码学习之:ClassLoader学习(5)-自测的更多相关文章
- 《Spring源码深度解析》学习笔记——Spring的整体架构与容器的基本实现
pring框架是一个分层架构,它包含一系列的功能要素,并被分为大约20个模块,如下图所示 这些模块被总结为以下几个部分: Core Container Core Container(核心容器)包含有C ...
- 创建ApplicationContext与BeanFactory时的区别-Spring源码学习之容器的基本实现
传送门 可以加载XML两种方法 使用 BeanFactory 加载 XML BeanFactory bf = new XmlBeanFactory(new ClassPathResource(&quo ...
- 搭建 Spring 源码阅读环境
前言 有一个Spring源码阅读环境是学习Spring的基础.笔者借鉴了网上很多搭建环境的方法,也尝试了很多,接下来总结两种个人认为比较简便实用的方法.读者可根据自己的需要自行选择. 方法一:搭建基础 ...
- spring源码学习之路---AOP初探(六)
作者:zuoxiaolong8810(左潇龙),转载请注明出处,特别说明:本博文来自博主原博客,为保证新博客中博文的完整性,特复制到此留存,如需转载请注明新博客地址即可. 最近工作很忙,但当初打算学习 ...
- Spring源码学习-容器BeanFactory(四) BeanDefinition的创建-自定义标签的解析.md
写在前面 上文Spring源码学习-容器BeanFactory(三) BeanDefinition的创建-解析Spring的默认标签对Spring默认标签的解析做了详解,在xml元素的解析中,Spri ...
- 框架源码系列六:Spring源码学习之Spring IOC源码学习
Spring 源码学习过程: 一.搞明白IOC能做什么,是怎么做的 1. 搞明白IOC能做什么? IOC是用为用户创建.管理实例对象的.用户需要实例对象时只需要向IOC容器获取就行了,不用自己去创建 ...
- Spring源码学习(总)
前文: ------------------------------------------------------------------------------------------------ ...
- spring源码学习之容器的基本实现
最近想拿出一部分时间来学习一下spring的源码,还特意买了一本书结合来看,当然主要是学习并跟着作者的思路来踏上学习spring的源码的道路,特意在此记录一下,<spring源码深度解析> ...
- spring源码学习(一)--AOP初探
LZ以前一直觉得,学习spring源码,起码要把人家的代码整体上通读一遍,现在想想这是很愚蠢的,spring作为一个应用平台,不是那么好研究透彻的,而且也不太可能有人把spring的源码全部清楚的过上 ...
- Spring 源码学习——Aop
Spring 源码学习--Aop 什么是 AOP 以下是百度百科的解释:AOP 为 Aspect Oriented Programming 的缩写,意为:面向切面编程通过预编译的方式和运行期动态代理实 ...
随机推荐
- JavaWeb XML
1. XML详解 1.1. XML介绍 1.1.1. 什么是XML XML的全称为eXtensible Markup Language,译为可扩展标记语言.XML语法上和HTML比较相似,但HTML中 ...
- 把Arch Linux安装到U盘上的具体教程
Arch Linux简介 Arch Linux(或称Arch)是一种以轻量简洁为设计理念的Linux发行版.其开发团队秉承简洁.优雅.正确和代码最小化的设计宗旨.Arch Linux 项目受 CRUX ...
- spring security采用基于简单加密 token 的方法实现的remember me功能
记住我功能,相信大家在一些网站已经用过,一些安全要求不高的都可以使用这个功能,方便快捷. spring security针对该功能有两种实现方式,一种是简单的使用加密来保证基于 cookie 的 to ...
- Parameter Binding in ASP.NET Web API
https://docs.microsoft.com/en-us/aspnet/web-api/overview/formats-and-model-binding/parameter-binding ...
- 低版本C++ string的万能转换,从long string 之间的转换来看看
string 转 long 那必须是万年atoi(),不过得配合c_str()使用! [plain] view plain copy #include <string> #include ...
- JavaScript中this关键字的使用比较
JavaScript中this关键字的使用比较 this关键字在JavaScript中,用的不能说比较多,而是非常多.那么熟悉this关键字的各种用法则显得非常关键. this有时候就是我们经常说的上 ...
- spring boot项目获取application配置文件参数的两种方式
前言:了解过spring boot这个技术的,应该知道spring boot的核心配置文件application.properties,当然也可以通过注解自定义配置文件**.properties的信息 ...
- Java多线程 - 线程同步
多线程操作同一个对象时,容易引发线程安全问题.为了解决线程安全问题,Java多线程引入了同步监视器. 同步代码块 同步代码块语法格式如下: synchronized(obj){ //此处的代码即为同步 ...
- LeetCode第[44]题(Java):Wildcard Matching
题目:通配符匹配 难度:hard 题目内容: Given an input string (s) and a pattern (p), implement wildcard pattern match ...
- 使用命令行启动spring boot项目
1.找到项目路径 cd target 2.敲命令--------java -jar xxxx.jar ------------------------------------------------- ...