当前位置: 首页 > wzjs >正文

政府内网网站建设百度刷排名seo软件

政府内网网站建设,百度刷排名seo软件,福州鼓楼区建设局网站,淘宝网站打算找人做在Java中,除了事先编写好代码完成执行代码,还可以从任何地方加载类。动态类加载允许程序在运行时动态编译和加载代码,打破了传统静态编译的限制。 主要的应用场景是插件系统、规则引擎、热部署等场景,本文将探讨其实现原理&#…

在Java中,除了事先编写好代码完成执行代码,还可以从任何地方加载类。动态类加载允许程序在运行时动态编译和加载代码,打破了传统静态编译的限制。

主要的应用场景是插件系统、规则引擎、热部署等场景,本文将探讨其实现原理,并给出完整的最佳实践方案。

一、动态加载核心原理

在这里插入图片描述

二、动态加载类代码

动态编译

// 该内容是字符串形式的类代码
String sourceCode = "public class DynamicDemo { /*...*/ }";
JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();
// DynamicDemo是字符串形式类代码的类名
JavaFileObject source = new StringJavaSource("DynamicDemo", sourceCode);// 使用内存文件管理器
MemoryJavaFileManager fileManager = new MemoryJavaFileManager(compiler.getStandardFileManager(null, null, null)
);// 执行编译任务
compiler.getTask(null, fileManager, null, null, null, Collections.singletonList(source)).call();

字节码内存管理

class MemoryJavaFileObject extends SimpleJavaFileObject {private final ByteArrayOutputStream bos = new ByteArrayOutputStream();@Overridepublic OutputStream openOutputStream() {return bos; // 字节码写入内存流}public byte[] getBytes() {return bos.toByteArray();}
}

类加载

public class MemoryClassLoader extends ClassLoader {private final Map<String, byte[]> classMap;@Overrideprotected Class<?> findClass(String name) {byte[] bytes = classMap.get(name);return defineClass(name, bytes, 0, bytes.length);}
}

利用反射调用

Class<?> clazz = classLoader.loadClass("DynamicDemo");
Object instance = clazz.newInstance();
Method method = clazz.getMethod("execute");
method.invoke(instance);

三、远程加载JAR到JVM

实现步骤

在这里插入图片描述

远程JAR下载

public byte[] downloadRemoteJar(String jarUrl) throws IOException {try (InputStream in = new URL(jarUrl).openStream();ByteArrayOutputStream out = new ByteArrayOutputStream()) {byte[] buffer = new byte[4096];int bytesRead;while ((bytesRead = in.read(buffer)) != -1) {out.write(buffer, 0, bytesRead);}return out.toByteArray();}
}

内存JAR解析

public class JarInMemory {private final Map<String, byte[]> classEntries = new HashMap<>();private final Map<String, byte[]> resourceEntries = new HashMap<>();public JarInMemory(byte[] jarBytes) throws IOException {try (JarInputStream jis = new JarInputStream(new ByteArrayInputStream(jarBytes))) {JarEntry entry;while ((entry = jis.getNextJarEntry()) != null) {if (entry.isDirectory()) continue;ByteArrayOutputStream bos = new ByteArrayOutputStream();byte[] buffer = new byte[4096];int bytesRead;while ((bytesRead = jis.read(buffer)) != -1) {bos.write(buffer, 0, bytesRead);}byte[] data = bos.toByteArray();String name = entry.getName();if (name.endsWith(".class")) {String className = name.replace(".class", "").replace('/', '.');classEntries.put(className, data);} else {resourceEntries.put(name, data);}}}}
}

自定义类加载器

public class RemoteJarClassLoader extends ClassLoader {private final Map<String, byte[]> classMap;private final Map<String, byte[]> resourceMap;public RemoteJarClassLoader(ClassLoader parent, JarInMemory jar) {super(parent);this.classMap = new HashMap<>(jar.getClassEntries());this.resourceMap = new HashMap<>(jar.getResourceEntries());}@Overrideprotected Class<?> findClass(String name) throws ClassNotFoundException {byte[] classBytes = classMap.get(name);if (classBytes == null) {throw new ClassNotFoundException(name);}return defineClass(name, classBytes, 0, classBytes.length);}@Overridepublic InputStream getResourceAsStream(String name) {byte[] data = resourceMap.get(name);return data != null ? new ByteArrayInputStream(data) : null;}
}

四、更简洁的加载远程JAR

利用内置的URLClassLoader类加载器直接加载远程JAR,JVM 会按需下载 JAR 中的类文件,首次访问类时才会触发下载。加载的类遵循父委托机制,优先由父类加载器加载。

// 远程 JAR 地址
String jarUrl = "http://xxxxx.cn/abc.jar";// 创建 ClassLoader
URL[] urls = { new URL(jarUrl) };
try (URLClassLoader classLoader = new URLClassLoader(urls)) {// 加载类Class<?> clazz = classLoader.loadClass("cn.tworice.MyClass");// 实例化并调用方法Object instance = clazz.getDeclaredConstructor().newInstance();clazz.getMethod("myMethod").invoke(instance);
}

五、类加载器的注意事项

需要注意的是,不同的类加载器即使加载的是同一个类,它们之间也不能相互转换。类的唯一性由类加载器实例 + 类的全限定类名进行标识。

举个例子,我的项目中有一个业务逻辑是动态加载的类实现了BaseNode接口,但由于BaseNode和动态加载的TestNode实现类使用了不同的类加载器,则无法将动态加载的TestNode实现类转为BaseNode接口。

http://www.dtcms.com/wzjs/421821.html

相关文章:

  • 怎样让网站显示网站建设中网络推广公司运营
  • 网站url备案一站式营销推广
  • 怎样做国际网站平台网站的seo是什么意思
  • 公司网站备案资料微信管理系统平台
  • 普通的宣传网站用什么做怎样注册自己网站的域名
  • 西安好的皮肤管理做团购网站seo管理
  • 美的地产集团官方网站建设企业推广平台有哪些
  • 防疫站24小时在线咨询选择宁波seo优化公司
  • 销售型企业网站全媒体广告投放平台
  • 安康网站建设公司茂名seo顾问服务
  • 招聘做网站专业人员宁波抖音seo搜索优化软件
  • 松江网站建设代做关键词收录排名
  • 如何做网站毕业设计网站宣传文案范例
  • 获取网站访客qq号长沙网红打卡景点排行榜
  • 网站建设广告图片深圳网络推广大师
  • 大学国际化网站建设定制建站网站建设
  • 网站虚拟主机管理蜘蛛seo超级外链工具
  • 做印刷品去哪个网站北京网站优化专家
  • 英文网站建设技术身边的网络营销案例
  • 学校网站开发的项目背景上海百度竞价
  • 自己做的网站怎么放上网提高百度搜索排名
  • 秒速网站建设免费b2b信息发布网站
  • 做互联网的网站百度地图疫情实时动态
  • 广州十大网站建设宝安网站建设
  • 在线网站模板网站安全检测在线
  • 汕头制作网站软件百度关键词点击工具
  • 恒信在线做彩票的是什么样的网站培训心得体会模板
  • 自助网站建设程序百度的人工客服
  • 做简历模板的网站都有哪些福州seo网站管理
  • 揭阳网站制作价格爱站网站长百度查询权重