『壹』 java动态探针加载与关闭
在Java应用中,可以使用动态探针来收集运行时的统计数据,以此来帮助优化性能。想要实现动含孙态探针的加载和关闭可以通过命令行参数来实现樱唤。具体地,可以使用-javaagent选项和指定的动态探针jar包路径来加载探针,在程序结束时,调用钩子方法关闭探针。在代码中,可以使用Runtime类的addShutdownHook方法注册一个优雅停机的钩子,这里可以先定义一个实现了Runnable接口的对象,当JVM需要或必须谈颂链退出时将自动调用它的run()方法。在run方法中,释放相关资源和关闭动态探针,以确保应用正常退出。
『贰』 java动态类加载机制有什么缺点
动态类加载主要是通过反射将类对象注入进去, 优点一大堆, 很多框架底层都有用到。
缺点:没有直接掉用直观方便。有些动态注入, 类型错误只有运行时才能发现。
『叁』 如何在Java运行的时候动态加载一个jar包到classpath里面
给你个例子自己看一下吧不会了再追问,注释基本都有了
.io.<imgid="selectsearch-icon"src="https://gss0.bdstatic.com/70cFsjip0QIZ8tyhnq/img/iknow/qb/select-search.png"alt="搜索">File;importjava.lang.reflect.<ahref="https://www..com/s?wd=Method&tn=44039180_cpr&fenlei=--bIi4WUvYETgN-"target="_blank"class="-highlight">Method</a>;importjava.net.<ahref="https://www..com/s?wd=URL&tn=44039180_cpr&fenlei=--bIi4WUvYETgN-"target="_blank"class="-highlight">URL</a>;importjava.net.<ahref="https://www..com/s?wd=URL&tn=44039180_cpr&fenlei=--bIi4WUvYETgN-"target="_blank"class="-highlight">URL</a><ahref="https://www..com/s?wd=Class&tn=44039180_cpr&fenlei=--bIi4WUvYETgN-"target="_blank"class="-highlight">Class</a>Loader;importjava.util.List;publicfinal<ahref="https://www..com/s?wd=class&tn=44039180_cpr&fenlei=--bIi4WUvYETgN-"target="_blank"class="-highlight">class</a>Ext<ahref="https://www..com/s?wd=Class&tn=44039180_cpr&fenlei=--bIi4WUvYETgN-"target="_blank"class="-highlight">Class</a>pathLoader{privatestatic<ahref="https://www..com/s?wd=Method&tn=44039180_cpr&fenlei=--bIi4WUvYETgN-"target="_blank"class="-highlight">Method</a>add<ahref="https://www..com/s?wd=URL&tn=44039180_cpr&fenlei=--bIi4WUvYETgN-"target="_blank"class="-highlight">URL</a>=initAdd<ahref="https://www..com/s?wd=Method&tn=44039180_cpr&fenlei=--bIi4WUvYETgN-"target="_blank"class="-highlight">Method</a>();=(URLClassLoader)ClassLoader.getSystemClassLoader();/***<ahref="https://www..com/s?wd=%E5%88%9D%E5%A7%8B%E5%8C%96&tn=44039180_cpr&fenlei=--bIi4WUvYETgN-"target="_blank"class="-highlight">初始化</a>addUrl方法.*@return可访问addUrl方法的Method对象*/(){try{Methodadd=URLClassLoader.class.getDeclaredMethod("addURL",newClass[]{URL.class});add.setAccessible(true);returnadd;}catch(Exceptione){thrownewRuntimeException(e);}}/***加载jarclasspath。*/publicstaticvoidloadClasspath(){List<String>files=getJarFiles();for(Stringf:files){loadClasspath(f);}List<String>resFiles=getResFiles();for(Stringr:resFiles){loadResourceDir(r);}}(Stringfilepath){Filefile=newFile(filepath);loopFiles(file);}(Stringfilepath){Filefile=newFile(filepath);loopDirs(file);}/***//***循环遍历目录,找出所有的资源路径。*@paramfile当前遍历文件*/privatestaticvoidloopDirs(Filefile){//资源文件只加载路径if(file.isDirectory()){addURL(file);File[]tmps=file.listFiles();for(Filetmp:tmps){loopDirs(tmp);}}}/***循环遍历目录,找出所有的jar包。*@paramfile当前遍历文件*/privatestaticvoidloopFiles(Filefile){if(file.isDirectory()){File[]tmps=file.listFiles();for(Filetmp:tmps){loopFiles(tmp);}}else{if(file.getAbsolutePath().endsWith(".jar")||file.getAbsolutePath().endsWith(".zip")){addURL(file);}}}/***通过filepath加载文件到classpath。*@paramfilePath文件路径*@returnURL*@throwsException异常*/privatestaticvoidaddURL(Filefile){try{addURL.invoke(classloader,newObject[]{file.toURI().toURL()});}catch(Exceptione){}}/****从配置文件中得到配置的需要加载到classpath里的路径集合。*@return*/privatestaticList<String>getJarFiles(){//TODO从properties文件中读取配置信息如果不想配置可以自己new一个List<String>然后把jar的路径加进去然后返回returnnull;}/***从配置文件中得到配置的需要加载classpath里的资源路径集合*@return*/privatestaticList<String>getResFiles(){//TODO从properties文件中读取配置信息略如果不想配置可以自己new一个List<String>然后把jar的路径加进去然后返回额如果没有资源路径为空就可以了returnnull;}publicstaticvoidmain(String[]args){ExtClasspathLoader.loadClasspath();}}
『肆』 一个java工程在运行的时候怎么动态加载另一个java工程
直接写上 new ClassFromPrj2(); 不用你手工“加载”,Java 中加载默认是由 JVM 虚拟器自动完成的,只要引用到的类ClassFromPrj2 在 classpath 中即可。等你达到中级水平,知道 Java Reflection 和 ClassLoader 之后你就知道是怎么回事了。
我是假设 loadJavaPrj 是第一个工程,假设它使用了第二个工程的类 ClassFromPrj2 的话,那就是
ClassFromPrj2 worker = new ClassFromPrj2();
worker.xxx();
你在运行中需要确保的是:prj2 这个工程的 jar 或 class folder 出现在 java -cp XXX 这个 classpath (-classpath 或 -cp) 参数列表中就可以了。
你在eclipse 项目的 .classpath 文件中发现的东西表明你还是尝试了解工具的细节,但那个仅仅是 Eclipse 用来帮我们生成命令行参数的配置文件,最终我们需要知道 javac 或 java 这样的命令行需要什么参数,这一点一般书上和老师都会讲到(但他们一般不会讲解Eclipse怎么工作的)。
『伍』 java中类的动态加载到底有什么作用,直接导入包在获取该类的实例不是一样吗
当然不一样啊,这样维护成本太高了,如果是动态加载只需要配置文件修改一岩丛下类库位置就可以了,假段枣如有100个类需要引用这握枣拆个第三方包那么就需要重新打开程序一个一个import吗?不符合开闭原则,不利于维护
『陆』 Java SWT动态加载界面(将界面的每个部分做成模块,然后由主程序load或者调用)
首先,把很多tab共同的方法抽出到一个抽象的类(我说的类,每个类都为独立文件)专,把一些有这样属的操作但是具体操作不确定的抽成抽象方法。列如抽象类可以 叫 AbstractedTab, 然后。具体的Tab各自单独用一个类继承AbstractedTab,根据自己特有的操作实现抽象方法。(这里有用到了一个设计模式:模板法),然后这些具体的的Tab可以根据需要,放到需要用到的类中new(产生)实例。
『柒』 java可以动态加载一个jar包,并且调用里面的类和方法吗
可以的
jar可以看成来是一个自存放很多class的的地方,jar包放入classpath后,其实只要能实现动态的加载类就可以实现题目中的需求了
技术是 java 反射机制,就是一个利用提供类全名而得到这个类实例的机制
通过反射得到Class这个类,然后可以得到关于这个类的方法,字段等相关信息
具体可以查看相关知识
『捌』 java怎么在静态方法中使用动态方法
Java静态方法是不能调用动态方法的,原因如下:x0dx0a1.因为静态方法和如孙动态方法嫌磨在内存中的位置不一样,静态方法的地址空间在加载类的时候就确定,而动态方法的地址空间在生成类实例的时候确定x0dx0a2.静态方法在程芹橡斗序初始化后会一直贮存在内存中,不会被垃圾回收器回收,x0dx0a 非静态方法只在该类初始化后贮存在内存中,当该类调用完毕后会被垃圾回收器收集释放。x0dx0a3.静态方法在初始化类时初始化,并分配内存;动态方法只有先创建类的实例对象后,才能调用动态方法
『玖』 怎样实现java代码的动态加载
1.将你这拆凳段字符串输出到一个文件里,用Java类文件的方式命名。
2.调用外部javac命令将该文件编译。
3.用类加载器(ClassLoad)动态加载新的class文件并用Class.forName()注册该类,然后就可以正常使用了。
上稿御毁面的每一步都能在中找到实现方法键备,自己发挥吧。
『拾』 关于java动态加载jar的问题
设我们有一个hello.jar文件,里面有一个Util类,我们希望在运行期调将这个jar包放入到我们运行环境并且调用里面的Util.getVersion方法。怎么实现?
在java中,我们的类都是通过ClassLoader来加载的,同时ClassLoader具有层级关系,当某个类找不到时,它会去他的父类加载器去寻找,如果依然找不到,就抛出ClassNotFoundException了。
为了动态加载hello.jar里面的Util类,我们需要将这个jar包放入到我们的类加载器中去,然后再获取里面的类。如下面的代码。
// 位于hello.jar
package com.flyingzl;
public class Util {
public static void getVersion(){
System.out.println("java version: " + System.getProperty("java.version"));
}
}
import java.io.File;
import java.lang.reflect.Method;
import java.net.URL;
import java.net.URLClassLoader;
public class Main {
public static void main(String[] args) {
URL[] urls = new URL[] {};
MyClassLoader classLoader = new MyClassLoader(urls, null);
try {
classLoader.addJar(new File("c:/hello.jar").toURI().toURL());
Class<?> clazz = classLoader.loadClass("com.flyingzl.Util");
Method method = clazz.getDeclaredMethod("getVersion");
method.invoke(null);
classLoader.close();
} catch (Exception e) {
e.printStackTrace();
}
}
static class MyClassLoader extends URLClassLoader {
public MyClassLoader(URL[] urls) {
super(urls);
}
public MyClassLoader(URL[] urls, ClassLoader parent) {
super(urls, parent);
}
public void addJar(URL url) {
this.addURL(url);
}
}
}
注意:这里仅仅是为了展示如何动态加载jar包,代码写得很粗,生产代码需要有更完善的异常处理。我们只关心如何动态加载jar包即可。
动态加载jar包,需要用到java.net.URLClassLoader这个类,它可以指定一个路径将jar包或者classes文件加载到类空间。加载完毕后,直接调用loadClass就可以加载指定的类,然后通过反射生成实例或者调用方法即可。
其实,Tomcat等服务器也利用了此思路,比如每一个web应用启动时,它都会自动加载其下的lib文件夹下的jar包。
运行程序,我们就可以看到程序正常输出:
java version: 1.7.0_03