【一】测试目的(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)-自测的更多相关文章

  1. 《Spring源码深度解析》学习笔记——Spring的整体架构与容器的基本实现

    pring框架是一个分层架构,它包含一系列的功能要素,并被分为大约20个模块,如下图所示 这些模块被总结为以下几个部分: Core Container Core Container(核心容器)包含有C ...

  2. 创建ApplicationContext与BeanFactory时的区别-Spring源码学习之容器的基本实现

    传送门 可以加载XML两种方法 使用 BeanFactory 加载 XML BeanFactory bf = new XmlBeanFactory(new ClassPathResource(&quo ...

  3. 搭建 Spring 源码阅读环境

    前言 有一个Spring源码阅读环境是学习Spring的基础.笔者借鉴了网上很多搭建环境的方法,也尝试了很多,接下来总结两种个人认为比较简便实用的方法.读者可根据自己的需要自行选择. 方法一:搭建基础 ...

  4. spring源码学习之路---AOP初探(六)

    作者:zuoxiaolong8810(左潇龙),转载请注明出处,特别说明:本博文来自博主原博客,为保证新博客中博文的完整性,特复制到此留存,如需转载请注明新博客地址即可. 最近工作很忙,但当初打算学习 ...

  5. Spring源码学习-容器BeanFactory(四) BeanDefinition的创建-自定义标签的解析.md

    写在前面 上文Spring源码学习-容器BeanFactory(三) BeanDefinition的创建-解析Spring的默认标签对Spring默认标签的解析做了详解,在xml元素的解析中,Spri ...

  6. 框架源码系列六:Spring源码学习之Spring IOC源码学习

    Spring 源码学习过程: 一.搞明白IOC能做什么,是怎么做的  1. 搞明白IOC能做什么? IOC是用为用户创建.管理实例对象的.用户需要实例对象时只需要向IOC容器获取就行了,不用自己去创建 ...

  7. Spring源码学习(总)

    前文: ------------------------------------------------------------------------------------------------ ...

  8. spring源码学习之容器的基本实现

    最近想拿出一部分时间来学习一下spring的源码,还特意买了一本书结合来看,当然主要是学习并跟着作者的思路来踏上学习spring的源码的道路,特意在此记录一下,<spring源码深度解析> ...

  9. spring源码学习(一)--AOP初探

    LZ以前一直觉得,学习spring源码,起码要把人家的代码整体上通读一遍,现在想想这是很愚蠢的,spring作为一个应用平台,不是那么好研究透彻的,而且也不太可能有人把spring的源码全部清楚的过上 ...

  10. Spring 源码学习——Aop

    Spring 源码学习--Aop 什么是 AOP 以下是百度百科的解释:AOP 为 Aspect Oriented Programming 的缩写,意为:面向切面编程通过预编译的方式和运行期动态代理实 ...

随机推荐

  1. Nginx 域名跳转

    域名跳转 就是实现URL的跳转和隐藏真实地址,基于Perl语言的正则表达式规范.平时帮助我们实现拟静态,拟目录,域名跳转,防止盗链等 . 域名跳转配置 1.多域名指定一个域名重定向 # 空格分割域名 ...

  2. 如何编写自己的虚拟DOM

    要构建自己的虚拟DOM,需要知道两件事.你甚至不需要深入 React 的源代码或者深入任何其他虚拟DOM实现的源代码,因为它们是如此庞大和复杂--但实际上,虚拟DOM的主要部分只需不到50行代码. 有 ...

  3. qss 样式不生效--注释不能嵌套

    qss 兼容 css 调qt样式的时候出现一个很奇怪的问题 删掉注释掉的内容 样式正常,不删注释 ,注释后面的样式全部失效.有点困惑的是: 感觉很困惑,后来发现里面有行中文注释,删掉中文注释就行了,以 ...

  4. JVM调优总结(一)

    数据类型 Java虚拟机中,数据类型可以分为两类:基本类型和引用类型.基本类型的变量保存原始值,即:他代表的值就是数值本身:而引用类型的变量保存引用值.“引用值”代表了某个对象的引用,而不是对象本身, ...

  5. MongoDB快速入门(十)- Limit(),Skip() 方法

    Limit() 方法 要限制 MongoDB 中的记录,需要使用 limit() 方法. limit() 方法接受一个数字型的参数,这是要显示的文档数. 语法: limit() 方法的基本语法如下 & ...

  6. hi.baidu.com 百度流量统计

    在字幕侠的官网访问之后,发现 <meta name="baidu-site-verification" content="3uvZd9Aact" /> ...

  7. UVA 1640 The Counting Problem(按位dp)

    题意:给你整数a.b,问你[a,b]间每个数字分解成单个数字后,0.1.2.3.4.5.6.7.8.9,分别有多少个 题解:首先找到[0,b]与[0,a-1]进行区间减法,接着就只是求[0,x] 对于 ...

  8. DIKW:数据、信息、知识、智慧的金字塔层次体系

    http://www.ciotimes.com/ProCase/85417.html 前言 知识对于个人.组织的重要性已经不言而喻.可以说,管理与应用知识的能力已经成为企业的核心竞争力. 知识如此重要 ...

  9. 解读Mirantis最新的Neutron性能测试

    最近,mirantis的工程师发布了最新的基于Mitaka版本的Neutron性能测试结果.得出的结论是:Neutron现在的性能已经可以用生产环境了. 报告的三位作者都是OpenStack社区的活跃 ...

  10. DatePicker日期与时间控件

    DatePicker日期与时间控件 一.简介 二.方法 最日常的使用方法了 日期控件DatePicker 时间控件TimePicker 月份从0开始 三.代码实例 效果图: 代码: fry.Activ ...