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 的缩写,意为:面向切面编程通过预编译的方式和运行期动态代理实 ...
随机推荐
- UEFI引导修复
一.用bcbboot自动修复 我们建议大家启动64位8PE,用它带的bcdboot来修复. (一)指定esp分区修复 环境为64位8PE,bios/uefi启动进入下都可以 1.启动64位8PE,并用 ...
- MySQL性能优化之max_connections参数
很多开发人员都会遇见”MySQL: ERROR 1040: Too many connections”的异常情况,造成这种情况的一种原因是访问量过高,MySQL服务器抗不住,这个时候就要考虑增加从服务 ...
- openstack认证实践
环境: 客户端:负责发送请求, 服务器:负责接受请求: 认证服务器keystone:负责认证 具体认证步骤: 1.客户端首先进行签名计算,将得到的签名字符串作为authorization发给keyst ...
- 安装pysqlite2
1. 从https://github.com/msabramo/pysqlite2 下载源码. 2.安装python-dev: sudo apt-get install python-dev 否则在 ...
- CSS 技巧总结
CSS 技巧和经验列表 1. 如何清除图片下方出现的几像素的空白 方法一: img{display:block;} 方法二: img{vertical-align:top;} 除了top值,还可以设置 ...
- crm开发(基于ssh)(2)
今天内容 1 新增客户 2 客户列表 3 修改客户 4 删除客户 5 分页显示客户列表 Hibernate模板里面的方法 1 新增客户 配置 <mapping resource="cn ...
- poj3517约瑟夫问题
直接套公式+ 假设除去第k个人. 0, 1, 2, 3, ..., k-2, k-1, k, ..., n-1 //original sequence (1) 0, 1, 2, 3, ..., k-2 ...
- nyoj-1316-二分
acm.nyist.edu.cn/JudgeOnline/problem.php?pid=1316题目链接 Interval 时间限制:2000 ms | 内存限制:65535 KB 难度:3 描 ...
- ZOJ 3488 Conic Section
The conic sections are the nondegenerate curves generated by the intersections of a plane with one o ...
- 照相、从相册上取照片、播放音频、播放本地视频、播放网络视频、MPMoviePlayerController
一.照相.从相册上去照片 1. 先判断是否支持照相功能 *判断当前设备是否支持照相功能,支持返回YES 否则返回NO 注意:模拟器不支持照相功能 把握一个原则只要是物理硬件相关的功能模拟器都不支持 例 ...