导航:首页 > 源码编译 > java9的动态编译器

java9的动态编译器

发布时间:2022-07-15 16:33:32

㈠ 有什么动态编译java源代码的框架

可以的,我说说大概思路,很简单,你自己具体实现吧,把代码写给你没意义的:

  1. 将你这段字符串输出到一个文件里,用Java类文件的方式命名。

  2. 2.调用外部javac命令将该文件编译。

  3. 3.用类加载器(ClassLoad)动态加载新的class文件并用Class.forName()注册该类,然后就可以正常使用了。

  4. 上面的每一步都能在中找到实现方法,自己发挥吧。

㈡ java动态编译遇到灵异事件,求围观

源码不就好了?

ToolProvider里的:

privatestaticfinalString[]defaultToolsLocation
={"lib","tools.jar"};
privatestaticClass<?>findClass()
throwsMalformedURLException,ClassNotFoundException{
try{
returnenableAsserts(Class.forName(defaultJavaCompilerName,false,null));
}catch(ClassNotFoundExceptione){
//ignored,trylookingelsewhere
}
Filefile=newFile(System.getProperty("java.home"));
if(file.getName().equalsIgnoreCase("jre"))
file=file.getParentFile();
for(Stringname:defaultToolsLocation)
file=newFile(file,name);
URL[]urls={file.toURI().toURL()};
ClassLoadercl=URLClassLoader.newInstance(urls);
cl.setPackageAssertionStatus("com.sun.tools.javac",true);
returnClass.forName(defaultJavaCompilerName,false,cl);
}

从java.home拿的路径,如果名字是jre,就找父目录

那java.home取出来是什么?还是看源码,参考open jdk的,比较长就不帖了,有兴趣可以自己搜,发链接审核估计会不通过,反正开源的很容易找

oracle官方对java.home的定义是Installation directory for Java Runtime Environment (JRE),这个在官方的The Java™ Tutorials里可以找到

所以可以看到如果java.home取到jdk下的jre,那自然可以从父目录/lib找到tool.jar,如果取的是和jdk同级的单独安装的那个jre,就得自己复制tool.jar

㈢ 求解 java动态编译找不到类,往各位大虾指导

参照网上其他童鞋的例子与介绍,修改了一下:
import java.io.IOException;
import java.lang.reflect.Method;
import java.net.URI;
import java.net.URISyntaxException;
import java.util.Arrays;

import javax.tools.JavaCompiler;
import javax.tools.JavaCompiler.CompilationTask;
import javax.tools.JavaFileObject;
import javax.tools.SimpleJavaFileObject;
import javax.tools.StandardJavaFileManager;
import javax.tools.ToolProvider;

/**
* 动态编译Java 源文件
*
* @author shenshouer
*
*/
public class CompilerTest {

public static void main(String[] args) throws Exception {
String source = "public class Main { " + "public static void main(String[]args) {"
+ "System.out.println(\"Hello World!\");" + "} " + "}";

JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();
StandardJavaFileManager fileManager = compiler.getStandardFileManager(null, null, null);
StringSourceJavaObject sourceObject = new CompilerTest.StringSourceJavaObject("Main",
source);
Iterable<? extends JavaFileObject> fileObjects = Arrays.asList(sourceObject);

// 获取编译类根路径,不然会报找不到类的错误
String path = Class.class.getClass().getResource("/").getPath();
Iterable< String> options = Arrays.asList("-d", path);

// 增加options参数
// CompilationTask task = compiler.getTask(null, fileManager, null, null, null, fileObjects);
CompilationTask task = compiler.getTask(null, fileManager, null, options, null, fileObjects);

boolean result = task.call();

if (result) {
System.out.println("编译成功。");

ClassLoader loader = CompilerTest.class.getClassLoader();
try {
Class<?> clazz = loader.loadClass("Main");
Method method = clazz.getMethod("main", String[].class);
// 修改调用参数,不然会报参数个数不对
// Object value = method.invoke(null, new Object[] {});
Object value = method.invoke(null, new Object[] {new String[]{}});
System.out.println(value);
} catch (Exception e) {
e.printStackTrace();
}
}
}

static class StringSourceJavaObject extends SimpleJavaFileObject {

private String content = null;

public StringSourceJavaObject(String name, String content) throws URISyntaxException {
super(URI.create("string:///" + name.replace('.', '/') + Kind.SOURCE.extension),
Kind.SOURCE);
this.content = content;
}

public CharSequence getCharContent(boolean ignoreEncodingErrors) throws IOException {
return content;
}
}
}

㈣ java怎么利用动态编译求四则运算式的结果贴代码的最后注释一下,免得我看不懂,求高手大神来回答

首先,要有个文本框,记录下来这个表达式,你说的,是要做个计算器吧,每个按钮提供一项功能,有数字键,有运算符键,实现一下

㈤ Java 一般用啥编译器好用 谢谢!

Borand 公司的jbuilder 9,jbuilder2005,jbuilder 2007 JBuilder是Borland公司开发的针对java的开发工具,使用JBuilder将可以快速,有效的开发各类java应用,它使用的JDK与sun公司标准的JDK不同,它经过了较多的修改,以便开发人员能够像开发Delphi应用那样开发java应用。 JBuilder的核心有一部分采用了VCL技术,使得程序的条理非常清晰,就算是初学者,也能完整的看完整个代码。JBuilder另一个特点是简化了团队合作,它采用的互联网工作室技术使不同地区,甚至不同国家的人联合开发一个项目成为了可能。 简单介绍一下Jbuilder的特点: 1Jbuilder支持最新的Java技术,包括Applets、JSP/Servlets、JavaBean以及EJB (Enterprise JavaBeans)的应用。 2用户可以自动地生成基于后端数据库表的EJB Java类,Jbuilder同时还简化了EJ B的自动部署功能.此外它还支持CORBA,相应的向导程序有助于用户全面地管理IDL(分布应用程序所必需的接口定义语言Interface Definition Language)和控制远程对象。 3Jbuilder支持各种应用服务器。Jbuilder与Inprise Application Server紧密集成,同时支持WebLogic Server,支持EJB 1.1和EJB 2.0,可以快速开发J2EE的电子商务应用。 4Jbuilder能用Servlet和JSP开发和调试动态Web 应用。 4利用Jbuilder可创建(没有专有代码和标记)纯Java2应用。由于Jbuilder是用纯J ava语言编写的,其代码不含任何专属代码和标记,它支持最新的Java标准。 4Jbuilder拥有专业化的图形调试接口,支持远程调试和多线程调试,调试器支持各种JDK版本,包括J2ME/J2SE/J2EE。JBuilder环境开发程序方便,它是纯的Java 开发环境,适合企业的J2EE开发;缺点是往往一开始人们难于把握整个程序各部分之间的关系,对机器的硬件要求较高,比较吃内存,这时运行速度显得较慢。 一直在用jbuilder写JAVA程序和网站,很好很优秀。

㈥ 在java代码中实现动态编译java文件

importjavax.tools.*;
importjava.io.*;
/**
*@authorhardneedl
*/
finalpublicclassMyCompile{

/**
*@paramargs命令行参数只有1个,即待编译的源代码文件的绝对路径
*@throwsFileNotFoundException
*/
publicstaticvoidmain(String...args)throwsFileNotFoundException{

JavaCompilercompiler=ToolProvider.getSystemJavaCompiler();
intr=compiler.run(null,null,null,args[0]);
System.out.println(r==0?"成功":"失败");
}

}

㈦ Java代码的静态编译和动态编译中的问题是什么

Java代码正常是静态编译成字节码,由对应平台的JVM加载执行,静态编译无法动态扩展功能。动态编译有两种方式实现:

  1. 从源码编译,需要调用Java Compiler,程序需要运行于JDK(而不是JRE)之上。

  2. 动态字节码生成技术(如CGLib、ASM)创建类。

动态编译可以简化代码,增强类功能,但也带来了代码复杂度,线上不易维护。

㈧ JAVA的编译器有哪些

JCreater 、JBuilder、eclipse、myeclipse、netbean这几个是主流,eclipse和myeclipse(eclipse的扩展功能更多)是主流中的主流

阅读全文

与java9的动态编译器相关的资料

热点内容
喷油螺杆制冷压缩机 浏览:577
python员工信息登记表 浏览:375
高中美术pdf 浏览:158
java实现排列 浏览:511
javavector的用法 浏览:980
osi实现加密的三层 浏览:230
大众宝来原厂中控如何安装app 浏览:912
linux内核根文件系统 浏览:241
3d的命令面板不见了 浏览:524
武汉理工大学服务器ip地址 浏览:147
亚马逊云服务器登录 浏览:523
安卓手机如何进行文件处理 浏览:70
mysql执行系统命令 浏览:929
php支持curlhttps 浏览:142
新预算法责任 浏览:443
服务器如何处理5万人同时在线 浏览:249
哈夫曼编码数据压缩 浏览:424
锁定服务器是什么意思 浏览:383
场景检测算法 浏览:616
解压手机软件触屏 浏览:348