【一】测试目的(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. Java:判断字符串是否为数字的五种方法

    Java:判断字符串是否为数字的五种方法 //方法一:用JAVA自带的函数 public static boolean isNumeric(String str){ for (int i = str. ...

  2. Linux服务器配置秘钥对连接

    [root@check2 ~]# ssh-keygen -t rsa Generating public/private rsa key pair. Enter file in which to sa ...

  3. 解析JDK动态代理实现原理

    JDK动态代理使用实例 代理模式的类图如上.关于静态代理的示例网上有很多,在这里就不讲了. 因为本篇讲述要点是JDK动态代理的实现原理,直接从JDK动态代理实例开始. 首先是Subject接口类. p ...

  4. Redis 后台运行

    编辑配置文件 vim {redis_home}/redis.conf 修改daemonize  (默认为no,修改为yes) 启动redis{redis_home}/src/redis-server ...

  5. Docker 容器内配置Tomcat manager 远程控制

    下载tomcat镜像  , docker run it docker exec -ti 容器ID /bin/bash 进入容器 apt-get update ,  apt-get install vi ...

  6. Effective C++ 条款03:尽可能使用const

    场景一 用于修饰指针 char greeting[] = "Hello"; char* p = greeting; // non-const pointer, non-const ...

  7. Windows下搭建Apache+Django+Python Web服务环境

    最近在学Django,想用Apache搭建一个服务器环境,因此在网上看了好多资料,很多都是用Python2.6和Apache2.2搭建的环境,不过我还是想用Python35和Apache24来搭建,具 ...

  8. 使用springmvc时报错JSPs only permit GET POST or HEAD

    两个地方需要注意:第一处在web.xml文件中不要忘记配置 <filter> <filter-name>HiddenHttpMethodFilter</filter-na ...

  9. 在myeclipse中安装svn

    首先下载site.zip,然后解压.在myeclipse的安装目录中的dropins文件夹中新建svn文件夹,把site中的features和plugins文件夹复制到svn中即可.然后重启Myecl ...

  10. CSS 实现隐藏滚动条同时又可以滚动(转)

    CSS 实现隐藏滚动条同时又可以滚动 移动端页面为了更接近原生的体验,是否可以隐藏滚动条,同时又保证页面可以滚动? 使用 overflow:hidden 隐藏滚动条,但存在的问题是:页面或元素失去了滚 ...