`
BucketLi
  • 浏览: 195074 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
博客专栏
5a76a659-f8e6-3bf3-b39a-8ae8f7a0f9d9
Percolator与分布...
浏览量:5674
社区版块
存档分类
最新评论

动态加载java代码

 
阅读更多
	public String compile(String srcFiles[]) {
		//StringWriter err = new StringWriter();
		//PrintWriter errPrinter = new PrintWriter(err);
		ByteArrayOutputStream err=new ByteArrayOutputStream();
		

		String args[] = buildJavacArgs(srcFiles);
		//int resultCode = com.sun.tools.javac.Main.compile(args, errPrinter);
		logger.warn("Dyna Complie Java Source:---->"+args);						
		JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();
		if(compiler==null){
			throw new NullPointerException("ToolProvider.getSystemJavaCompiler() return null,please use JDK replace JRE!");
		}
		int resultCode = compiler.run(null, null, err, args);
		
		return (resultCode == 0) ? null : err.toString();
	}


参数设置正确了
private String[] buildJavacArgs(String srcFiles[]) {
		ArrayList args = new ArrayList();

		if (classpath != null) {
			args.add("-classpath");
			args.add(classpath);
		}
		if (outputdir != null) {
			args.add("-d");
			args.add(outputdir);
		}
		if (sourcepath != null) {
			args.add("-sourcepath");
			args.add(sourcepath);
		}
		if (bootclasspath != null) {
			args.add("-bootclasspath");
			args.add(bootclasspath);
		}
		if (extdirs != null) {
			args.add("-extdirs");
			args.add(extdirs);
		}
		if (encoding != null) {
			args.add("-encoding");
			args.add(encoding);
		}
		if (target != null) {
			args.add("-target");
			args.add(target);
		}

		for (int i = 0; i < srcFiles.length; i++) {
			args.add(srcFiles[i]);
		}

		return (String[]) args.toArray(new String[args.size()]);
	}


/**
	 * Extracts a classpath string from a given class loader. Recognizes only
	 * URLClassLoader.
	 */
	private static String extractClasspath(ClassLoader cl) {
		StringBuffer buf = new StringBuffer();

		while (cl != null) {
			if (cl instanceof URLClassLoader) {
				URL urls[] = ((URLClassLoader) cl).getURLs();

				for (int i = 0; i < urls.length; i++) {
					if (buf.length() > 0) {
						buf.append(File.pathSeparatorChar);
					}
					String s = urls[i].getFile();

					try {
						s = URLDecoder.decode(s, "UTF-8");
					} catch (UnsupportedEncodingException e) {
						continue;
					}
					File f = new File(s);

					// f.isFile()
					buf.append(f.getAbsolutePath());
				}
			}
			cl = cl.getParent();
		}
		return buf.toString();
	}


创建load上述class的ClassLoader时,指定的load class的路径要和上面编译的输出路径一致
classLoader = new URLClassLoader(new URL[] { binDir.toURL() },
						parentClassLoader);


后面就可以用特定的ClassLoader来加载class文件了,再后面就可以newInstance了。
分享到:
评论

相关推荐

    Java动态编译Java代码,运行在内存中,并执行

    添加动态执行的编译环境 options 是个集合,添加内容,字符集,classpath等 * 6.传入JavaFileObject的java文件,是个集合,创建JavaSourceObject实现这个接口,Kind.SOURCE.extension = '.java' * 7.创建任务并...

    springboot+java类热加载

    综上所述,"springboot+java类热加载"是一个涉及SpringBoot框架、Java类加载机制、动态编译以及依赖管理的综合技术话题。通过理解这些概念和相关工具,开发者可以更高效地进行迭代开发,提高生产力。在实际应用中,...

    Java类动态加载(一)——java源文件动态编译为class文件

    这篇博客“Java类动态加载(一)——java源文件动态编译为class文件”可能主要探讨了如何在运行时将Java源代码(.java)编译成对应的字节码文件(.class),并将其加载到Java虚拟机(JVM)中。以下是对这个主题的详细解析...

    Java语言-动态编译代码并热加载类

    在Java编程中,动态编译代码并热加载类是一项重要的技术,它允许程序在运行时修改或添加新的类,而无需重启应用。这种能力对于快速迭代开发、调试和性能优化非常有用。本主题将深入探讨Java中的动态编译与热加载机制...

    java动态代码执行

    Java动态代码执行是一种在运行时编译和执行代码的技术,它可以极大地提高程序的灵活性和可扩展性。在Java中,Groovy是一个强大的脚本语言,它与Java语法兼容,并且可以无缝集成到Java应用程序中,使得动态代码执行变...

    JDK8 下 SpringBoot 应用动态编译 Java 源码并注入 Spring 容器

    基于接口、抽象类实现不停机动态调整代码的目的,将修改后的源码文件放置于指定目录下,读取文件后执行动态编译方法,即可将该类重新加载,新的类可以在Spring容器从新注册,且仅在当前窗口生效。如果重启了服务或...

    java代码启动tomcat

    在 Java 代码中使用 Tomcat 服务器时,需要添加必要的 JAR 包,并实现 Tomcat 服务器的启动和停止。在本示例代码中,我们使用了 Tomcat 服务器来发布 Web 应用程序,并实现了远程控制 Tomcat 服务器的生命周期。 ...

    Java动态生成代码并编译载入

    比如,当需要实现动态配置的业务规则时,可以通过这种方式将用户定义的规则转换为Java代码并加载执行。再比如,某些性能敏感的系统可能使用这种方法来即时生成和优化特定场景的代码,以达到更高的运行效率。 总的来...

    将java代码生成html并且高亮显示的类

    1. **代码解析**:我们需要解析Java代码,识别关键字、注释、字符串、变量等元素。这可以通过使用正则表达式或者专门的代码解析库来实现。例如,Java的ANTLR库可以解析Java语法,并提供抽象语法树(AST),方便...

    Java代码执行漏洞中类动态加载的应用1

    本文主要探讨了Java代码执行漏洞中类动态加载的应用,特别是通过自定义ClassLoader和反射调用`defineClass`方法来实现字节码的动态解析。 首先,Java中类的加载方式有两种:显式加载和隐式加载。隐式加载通常发生在...

    Java 动态加载jar文件示例

    在Java编程语言中,动态加载jar文件是一种关键的特性,它允许程序在运行时加载新的类库或组件,而不是在编译时静态地链接。这种技术对于实现插件式开发或者模块化系统至关重要,因为它提供了灵活性和可扩展性。下面...

    完整的Java代码审计学习笔记资源(免费下载)

    java代码审计-sqli.md 第一的 4年前 java代码审计-ssrf.md 第一的 4年前 java代码审计-ssti.md 第一的 4年前 java代码审计-xss.md 第一的 4年前 java代码审计-xxe.md 第一的 4年前 java代码审计-反序列化.md 添加...

    jsp中添加java代码

    这是自己学习时的例子,能运行,很好地反映了如何在jsp中输出java代码!

    Java 实现的面向接口的动态加载驱动的方法

    当我们谈论“Java实现的面向接口的动态加载驱动的方法”,我们实际上在讨论如何在运行时动态地加载实现了特定接口的类,以便于在不修改原有代码的情况下,插入新的功能或替换旧的实现。 以MySQL数据库驱动为例,...

    java swing 多选下拉框 支持动态加载数据

    Java Swing 是Java GUI(图形用户界面)库,用于构建...通过以上知识点的应用,你可以创建一个能够动态加载数据且支持多选的Java Swing下拉框。这种组件在各种数据选择场景中都非常有用,如配置设置、过滤器选择等。

    Java动态生成代码并编译载入.pdf

    Java动态生成代码并编译载入是一个高级的编程技术,主要用于那些需要在应用程序运行时根据某些模板和数据动态地生成、编译和加载Java代码的场景。这种技术在需要高度定制化处理或是运行时参数化生成业务逻辑的系统中...

    java代码生成数字证书

    Java代码生成数字证书涉及到几个关键概念和技术,包括Java的密钥和证书管理、RSA加密算法以及非交互式证书创建。在此,我们将深入探讨这些主题,以便理解如何在Java环境中生成和使用数字证书。 1. **数字证书**:...

    《kettle中调用java类》示例代码

    在标题《kettle中调用java类》示例代码中,我们关注的是如何在Kettle的转换或作业中嵌入Java代码,以实现更复杂的数据处理逻辑。 首先,Kettle支持两种方式来调用Java类:使用“Java Class”步骤和使用“Execute ...

    java代码-解决添加子弹的问题java源代码

    java代码-解决添加子弹的问题java源代码 ——学习参考资料:仅用于个人学习使用

    动态编译、加载java类

    在Java编程中,动态编译和加载类是一种高级特性,它允许程序在运行时编译源代码并将其加载到Java虚拟机(JVM)中。这种能力对于开发灵活性高、可扩展性强的应用程序非常有用,比如在服务器端处理动态生成的代码、...

Global site tag (gtag.js) - Google Analytics