Nvwa——JFramework之热加载、IOC

u010234286 2018-03-16 07:08:44
github地址:https://github.com/gugumall/JFramework
完整项目介绍:https://bbs.csdn.net/topics/392340442
开发文档:https://www.gugumall.cn/downloads/JFrameworkDoc.docx

本来想把代码都贴出来的,结果超出帖子长度了,有兴趣的朋友去github下载吧

实现热加载的类加载器:
package j.nvwa;

public abstract class NvwaClassLoader extends java.lang.ClassLoader {
/**
*
*
*/
public NvwaClassLoader() {
super();
}

/**
*
* @param path
* @param jarpath
* @return
* @throws Exception
*/
public abstract NvwaClassLoader getInstance(String path,String jarpath)throws Exception;

/**
*
* @param classpath
* @param jarpath
*/
public abstract void setClasspath(String classpath,String jarpath);

/**
*
* @param name
* @return
* @throws Exception
*/
protected abstract boolean needRenew(String name)throws Exception;
}


package j.nvwa;

import j.util.ConcurrentMap;
import j.util.JUtilInputStream;
import j.util.JUtilString;
import j.util.JUtilTimestamp;

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.lang.reflect.Field;
import java.util.jar.JarEntry;
import java.util.jar.JarFile;

/**
* 自动检查类文件是否更新,如更新则自动重新加载
*
* @author JFramework
*
*/
public class NvwaClassLoaderAutoRenew extends NvwaClassLoader {
private String classpath;// 类文件存放根目录
private String jarpath;// jar文件存放根目录

private static ConcurrentMap classes = new ConcurrentMap();// 已加载的类
private static ConcurrentMap lastModified = new ConcurrentMap();// 类文件上次修改时时间
private static ConcurrentMap jarFileLocations=new ConcurrentMap();
private static ConcurrentMap instances = new ConcurrentMap();// 键:类文件存放根目录 值:与之对应的ClassLoaderAutoUpdate实例

/**
*
*
*/
public NvwaClassLoaderAutoRenew() {
super();
}

/*
* (non-Javadoc)
* @see j.nvwa.NvwaClassLoader#setClasspath(java.lang.String, java.lang.String)
*/
public void setClasspath(String classpath,String jarpath){
this.classpath=classpath;
this.jarpath=jarpath;
}

/*
* (non-Javadoc)
* @see j.nvwa.NvwaClassLoader#getInstance(java.lang.String, java.lang.String)
*/
public NvwaClassLoader getInstance(String path,String jarpath)throws Exception {
if (!instances.containsKey(path+jarpath)) {
NvwaClassLoaderAutoRenew loader = new NvwaClassLoaderAutoRenew();
Field field = ClassLoader.class.getDeclaredField("parent");
field.setAccessible(true);
field.set(loader,Nvwa.defaultClassLoader);


loader.setClasspath(path,jarpath);
instances.put(path+jarpath, loader);
}
return (NvwaClassLoader) instances.get(path+jarpath);
}

/*
* (non-Javadoc)
* @see j.nvwa.NvwaClassLoader#renew(java.lang.String)
*/
protected boolean needRenew(String name)throws Exception{
if (!responsible(name)){
return false;
}

try {
name = name.intern();
synchronized (name) {
String filePath = getFile(this.classpath,name);

File file = new File(filePath);
if (!file.exists()){
return false;
}

long latestUpd = file.lastModified();
file = null;

if (classes.containsKey(name) && lastModified.containsKey(name)) {// 已经加载过,判断是否已更新
Long lastUpd = (Long) lastModified.get(name);

return (lastUpd.longValue() != latestUpd);
}
}
}catch (Exception e) {
e.printStackTrace();
}
return false;
}

/**
*
* @param path
* @param jarpath
* @return
* @throws Exception
*/
private NvwaClassLoader getNewInstance(String path,String jarpath)throws Exception {
NvwaClassLoaderAutoRenew loader = new NvwaClassLoaderAutoRenew();
loader.setClasspath(path,jarpath);
return loader;
}

/*
* (non-Javadoc)
* @see java.lang.ClassLoader#loadClass(java.lang.String, boolean)
*/
public Class<?> loadClass(String name, boolean resolve) throws ClassNotFoundException {
if (!responsible(name)){
return Nvwa.defaultClassLoader.loadClass(name);
}

try {
name = name.intern();
synchronized (name) {
String filePath = getFile(this.classpath,name);

boolean inJar=false;

File file = new File(filePath);
if (!file.exists()){
String inJarFilePath=getJarFile(name);
if(inJarFilePath==null){
throw new ClassNotFoundException("class file is not exists - "+name);
}else{
file=new File(inJarFilePath);
inJar=true;
}
}

long latestUpd = file.lastModified();
file = null;

if (classes.containsKey(name) && lastModified.containsKey(name)) {// 已经加载过,判断是否已更新
Long lastUpd = (Long) lastModified.get(name);

if (lastUpd.longValue() == latestUpd) {// 未更新且已经加载
return (Class) classes.get(name);
}else{//更新了,重新加载
System.out.println(JUtilTimestamp.timestamp()+" j.nvwa.NvwaClassLoaderAutoRenew renew "+name);
NvwaClassLoaderAutoRenew newLoader=(NvwaClassLoaderAutoRenew)getNewInstance(this.classpath,this.jarpath);
Class clazz=defineClazz(newLoader,resolve,latestUpd,name,inJar);
return clazz;
}
}else{
Class clazz=defineClazz(this,resolve,latestUpd,name,inJar);
return clazz;
}
}
}catch (Exception e) {
e.printStackTrace();
}

throw new ClassNotFoundException();
}

/**
*
* @param loader
* @param resolve
* @param latestUpd
* @param name
* @param inJar
* @return
* @throws Exception
*/
private Class defineClazz(NvwaClassLoaderAutoRenew loader,boolean resolve,long latestUpd,String name,boolean inJar) throws Exception{
byte[] classData = loader.loadClassData(name,inJar);

Class clazz = loader.defineClass(name, classData, 0,classData.length);
if(resolve) loader.resolveClass(clazz);

lastModified.put(name,new Long(latestUpd));
classes.put(name,clazz);

return clazz;
}

/**
* 判断是否由ClassLoaderAutoUpdate进行加载
* @param name
* @return
*/
private boolean responsible(String name){
return Nvwa.isDefinedImplementation(name);
}

/**
* get class file path from full name of class
*
* @param root - root path of classes
* @param classname - full name of class
* @return
*/
private String getFile(String root, String classname) {
return root + JUtilString.replaceAll(classname, ".", File.separator)+ ".class";
}

/**
*
* @param name
* @param inJar
* @return
* @throws IOException
*/
private byte[] loadClassData(String name,boolean inJar) throws Exception {
if(!inJar){
String filePath = getFile(this.classpath, name);

File file = new File(filePath);
if (file.exists() && file.isFile()) {
return JUtilInputStream.bytes(new FileInputStream(filePath));
} else {
throw new IOException("file of class " + name + " not found.");
}
}else{
String entryName=JUtilString.replaceAll(name, ".", "/")+".class";
String jarFilePath=getJarFile(name);
JarFile jar=new JarFile(getJarFile(name));
JarEntry en=jar.getJarEntry(entryName);

byte[] bs=JUtilInputStream.bytes(jar.getInputStream(en));
System.out.println("data of jar file "+name+" in "+jarFilePath+" loaded,the size is - "+bs.length);

jar.close();
return bs;
}
}

/**
* get class file path from full name of class
*
* @param root - root path of classes
* @param classname - full name of class
* @return
*/
private String getJarFile(String classname) throws Exception{
if(jarpath==null) return null;

if(jarFileLocations.containsKey(classname)) return (String)jarFileLocations.get(classname);

File jarDir=new File(jarpath);
if(!jarDir.isDirectory()||!jarDir.exists()) return null;

File[] jars=jarDir.listFiles();
for(int i=0;i<jars.length;i++){
if(!jars[i].getName().toLowerCase().endsWith(".jar")) continue;

String entryName=JUtilString.replaceAll(classname, ".", "/")+".class";

JarFile jar=new JarFile(jars[i]);
JarEntry en=jar.getJarEntry(entryName);
if(en!=null&&!en.isDirectory()){
System.out.println("find "+classname+" in jar "+jars[i].getAbsolutePath()+","+en.getCompressedSize());
jarFileLocations.put(classname,jars[i].getAbsolutePath());

jar.close();
return jars[i].getAbsolutePath();
}

jar.close();
}

return null;
}
}

...全文
457 回复 打赏 收藏 转发到动态 举报
写回复
用AI写文章
回复
切换为时间正序
请发表友善的回复…
发表回复
内容概要:本文围绕城市场景下的无人机三维路径规划问题,提出了一种新颖的多目标粒子群优化算法(NMOPSO),旨在解决高维复杂环境中路径规划面临的多重挑战。研究聚焦于导航变量的多目标优化,构建了一个包含路径长度、飞行安全性、能量消耗等多个相互冲突目标的优化模型,并采用改进的粒子群算法进行高效搜索,最终获得一组Pareto最优解集,为实际决策提供多样化路径选择方案。该方法结合Matlab代码实现,详细阐述了算法的设计机制、数学建模流程及仿真验证过程,充分展示了其在密集城市建筑环境中有效规避障碍物、满足飞行动力学约束并实现多目标权衡的能力,具有较强的工程应用价值。; 适合人群:具备一定优化算法理论基础和Matlab编程能力,从事无人机路径规划、智能交通系统、自动化控制、人工智能应用等方向研究的研究生、科研人员及工程技术人员。; 使用场景及目标:①应用于城市环境中的无人机物流配送、巡检监控、应急救援等实际任务的三维路径规划;②为高维、非线性、多约束的多目标优化问题提供有效的算法设计思路与改进参考;③通过Matlab仿真平台复现算法,进一步开展性能测试、参数调优与算法对比研究,推动相关领域的技术创新。; 阅读建议:此资源强调算法原理与工程实践的深度融合,建议读者重点研读目标函数的构建方式、约束条件的处理策略以及NMOPSO算法的核心改进机制,并务必动手运行和调试所提供的Matlab代码,以深入理解算法在三维空间路径优化中的具体实现细节与实际表现。
内容概要:本文档围绕基于10机39节点的电力系统仿真展开,依托Matlab/Simulink平台构建标准电力系统模型,系统性地实现了电力系统稳态与暂态过程的仿真分析。内容涵盖潮流计算、短路故障、暂态稳定性、N-k故障分析、蓄意攻击与级联故障模拟等核心问题,并引入混合整数线性规划(MILP)等优化方法进行电网脆弱性评估与关键故障筛选。文档突出科研复现导向,整合了状态估计、虚假数据注入攻击、优化算法等前沿技术的交叉应用,具有较强的理论深度与工程实践价值。; 适合人群:具备电力系统基本理论知识和Matlab/Simulink仿真能力的研究生、科研人员及电力工程技术人员,特别适用于从事电力系统稳定性分析、安全防护、故障演化机制与优化调度等领域研究的专业人士。; 使用场景及目标:① 掌握10机39节点系统的建模方法与仿真流程;② 学习并复现电力系统典型故障(如短路、N-k故障、级联故障)的建模与动态响应分析;③ 理解基于MILP的电网脆弱性评估、攻击策略建模与故障传播机制;④ 结合优化算法开展电力系统安全防御、恢复策略与韧性提升研究。; 阅读建议:建议结合文档中标注的“顶级EI复现”“核心论文复现”等标签,重点关注模型构建逻辑与代码实现细节,优先运行仿真案例以理解其物理背景与数学建模原理,同时深入分析故障场景设定、目标函数设计及优化求解策略的工程意义与学术价值。

62,622

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧