Java ClassLoader动态加载外部java代码
来源:互联网 发布:雷特字幕mac 编辑:程序博客网 时间:2024/05/15 15:40
外部代码
package priv.tuyou;public class Say {public void say(){System.out.println("say priv.tuyou.hello");}}
动态加载示例
import java.io.ByteArrayOutputStream;import java.io.File;import java.io.FileInputStream;import java.io.FileNotFoundException;import java.io.IOException;import java.io.InputStream;import java.lang.reflect.InvocationTargetException;import java.lang.reflect.Method;public class PathClassLoader extends ClassLoader{private String classPath;public PathClassLoader(String classPath){this.classPath = classPath;}@Overrideprotected Class<?> findClass(String arg0) throws ClassNotFoundException {byte[] data = getData(arg0);if(data == null){throw new ClassNotFoundException();}return defineClass(arg0, data, 0, data.length);}private byte[] getData(String className){String path = classPath + File.separatorChar + className.replace(".", File.separator) + ".class";try {InputStream is = new FileInputStream(path);ByteArrayOutputStream out = new ByteArrayOutputStream();byte[] buffer = new byte[1024];int count = 0;while((count = is.read(buffer)) != -1){out.write(buffer, 0, count);}return out.toByteArray();} catch (FileNotFoundException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}return null;}/** * 使用同一个ClassLoader重复加载一个类会报错 * @author:涂有 * @date 2017年3月3日 下午1:38:05 */public static void main2(String[] args) throws ClassNotFoundException, SecurityException, NoSuchMethodException, IllegalArgumentException, IllegalAccessException, InvocationTargetException, InstantiationException {PathClassLoader loader = new PathClassLoader("/Users/apple/temp");//第一次加载Class say = loader.findClass("priv.tuyou.Say");Method method = say.getMethod("say");Object instance = say.newInstance();method.invoke(instance);//第二次加载,报错//java.lang.LinkageError: loader (instance of PathClassLoader): attempted duplicate class definition for name: "Say"Class say2 = loader.findClass("priv.tuyou.Say");Method method2 = say2.getMethod("say");Object instance2 = say2.newInstance();method2.invoke(instance2);}/** * 重新new一个ClassLoader加载同一个类不会报错 * @author:涂有 * @date 2017年3月3日 下午1:38:53 */public static void main(String[] args) throws ClassNotFoundException, SecurityException, NoSuchMethodException, IllegalArgumentException, IllegalAccessException, InvocationTargetException, InstantiationException {//第一次加载PathClassLoader loader = new PathClassLoader("/Users/apple/temp");Class say = loader.findClass("priv.tuyou.Say");Method method = say.getMethod("say");Object instance = say.newInstance();method.invoke(instance);//第二次加载,不会报错PathClassLoader loader2 = new PathClassLoader("/Users/apple/temp");Class say2 = loader2.findClass("priv.tuyou.Say");Method method2 = say2.getMethod("say");Object instance2 = say2.newInstance();method2.invoke(instance2);System.out.println(instance == instance2);}}
阅读全文
0 0
- Java ClassLoader动态加载外部java代码
- java classLoader动态加载
- java classLoader动态加载
- Java URLClassLoader动态加载外部java代码
- java ClassLoader机制和如何加载外部class文件(含代码)
- 实现java classloader 动态加载jar包
- Java中的ClassLoader 动态加载机制
- 【java】自定义ClassLoader 加载外部类和jar文件
- java代码实现利用 classloader 动态加载 jar包、文件夹到classpath中
- Java ClassLoader加载.jar
- Java ClassLoader加载.jar
- java ClassLoader加载资源
- Java类加载/ClassLoader
- Java ClassLoader加载.jar
- Java 类加载Classloader
- Java类加载ClassLoader
- JAVA ClassLoader加载类
- Java运行时动态加载类之ClassLoader
- Solr在admin界面使用(Solr Command (raw XML or JSON))提交多份documents的方法
- 8.13-8.14训练总结
- KMP算法分析
- HTML,XHTML和XML
- 数据对齐那些事
- Java ClassLoader动态加载外部java代码
- HTTPS
- http://cwiki.apache.org/confluence/display/MAVEN/MojoExecutionException异常解决方法
- java实现学生管理系统
- 安卓6.0 的动态权限
- springmvc上传图片
- jdbc中关于时间的处理
- 【技巧】可撤销贪心
- NSQ特点总结