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 的缩写,意为:面向切面编程通过预编译的方式和运行期动态代理实 ...
随机推荐
- 什么是MSB/LSB码?
MSB是Most Significant Bit的缩写,最高有效位.在二进制数中,MSB是最高加权位.与十进制数字中最左边的一位类似.通常,MSB位于二进制数的最左侧,LSB位于二进制数的最右侧. L ...
- bzoj 3884 上帝与集合的正确用法 指数循环节
3884: 上帝与集合的正确用法 Time Limit: 5 Sec Memory Limit: 128 MB[Submit][Status][Discuss] Description 根据一些 ...
- throws和throw的用法例子以及检测和非检查异常
throws E1,E2,E3 只是告诉程序这个方法可能会抛出这些个异常,方法的调用者可能要处理这些异常.而这些异常E1,E2,E3可能是该函数体产生的. 而throw是明确之处这个地方要抛出这个异常 ...
- css类名大全以及其他关键词
标签 abbr 缩写的标记 token-based-auth-backend 后端 token-based-auth-frontend 前端 signin 登陆 Sign in / Sign u ...
- JDeveloper 10g Certified on Windows 10 for EBS 12.1
JDeveloper 10g is now certified for Windows 10 desktops for Oracle E-Business Suite 12.1. See: Reco ...
- python 2 3 读写中文文件 使用codecs最方便
codecs进行文件的读取 python给我们提供了一个包codecs进行文件的读取,这个包中的open()函数可以指定编码的类型: import codecs f = codecs.open('te ...
- cassandra框架模型之二——存储机制 CommitLog MemTable SSTable
四.副本存储 Cassandra不像HBase是基于HDFS的分布式存储,它的数据是存在每个节点的本地文件系统中. Cassandra有三种副本配置策略: 1) SimpleStrategy (Rac ...
- 013——VUE中多种方式使用VUE控制style样式属性
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...
- shell编程-数组
#!bin/bash/ A=(a b c hello) echo ${A[*]} echo ${A[@]} ]} ]} ]} ]} ]}echo ${#A[*]} #测数组长度方法1echo ${#A ...
- html03表单
<!DOCTYPE HTML> <html> <head> <title>用户登录的表单</title> </head> < ...