
正文
java+编译器+代码 java编译器
提示:扫一扫查出行【扫一扫了解最新限行尾号】
复制提示
Java编译器如何生成重载和覆盖方法代码
举个简单java+编译器+代码的例子,展示了多态性(Polymorphism):重载(Overloaded)和覆盖(Overridden)。
多态性意味着方法可以在不同的时刻表现出不同的形式。在编译期间,这被称为方法重载。重载允许相关的方法可以使用相同的方法名访问。有时候这被称为ad hoc polymorphism,与parametric polymorphism 不同。
输出:
intstringoverriden int
从编译器的角度讲,如何生成能够正确调用的函数的代码java+编译器+代码?
静态重载(Static overloading)不难实现。当处理一个重载方法的声明时,一个新的绑定会被映射到一个不同的实现。在处理类型检查的过程中,编译器会分析参数的实际类型,然后决定使用哪个方法。
动态重载(Dynamic overloading )允许运行时根据实际参数的类型来选择函数的不同实现。这是动态调度(dynamic dispatch)的一种形式。
动态调度也被用来实现方法覆盖。被覆盖的方法的调用由运行期间实际对象的类型决定的。
相关问答
Q1: Java进阶:SE6调用编译器的两种方法[1]
在很多Java应用中需要在程序中调用Java编译器来编译和运行 但在早期java+编译器+代码的版本中(Java SE 及以前版本)中只能通过tools jar中的 sun tools javac包来调用Java编译器 但由于tools jar不是标准的Java库 在使用时必须要设置这个jar的路径 而在Java SE 中为java+编译器+代码我们提供java+编译器+代码了标准的包来操作Java编译器 这就是javax tools包 使用这个包 我们可以不用将jar文件路径添加到classpath中java+编译器+代码了
一 使用JavaCompiler接口来编译Java源程序
使用Java API来编译Java源程序有很多方法 现在让我们来看一种最简单的方法 通过JavaCompiler进行编译
我们可以通过ToolProvider类的静态方法getSystemJavaCompiler来得到一个JavaCompiler接口的实例
JavaCompiler piler = ToolProvider getSystemJavaCompiler();
JavaCompiler中最核心的方法是run 通过这个方法可以编译java源程序 这个方法有 个固定参数和 个可变参数(可变参数是从Jave SE 开始提供的一个新的参数类型 用type… argu表示) 前 个参数分别用来为java编译器提供参数 得到Java编译器的输出信息以及接收编译器的错误信息 后面的可变参数可以传入一个或多个Java源程序文件 如果run编译成功 返回
int run(InputStream in OutputStream out OutputStream err String arguments)
如果前 个参数传入的是null 那么run方法将以标准的输入 输出代替 即System in System out和System err 如果我们要编译一个test java文件 并将使用标准输入输出 run的使用方法如下
int results = tool run(null null null test java );
下面是使用JavaCompiler的完整代码
import java io *;import javax tools *;public class test_pilerapi{ public static void main(String args[]) throws IOException { JavaCompiler piler = ToolProvider getSystemJavaCompiler(); int results = piler run(null null null test java ); System out println((results == )? 编译成功 : 编译失败 ); // 在程序中运行test Runtime run = Runtime getRuntime(); Process p = run exec( java test ); BufferedInputStream in = new BufferedInputStream(p getInputStream()); BufferedReader br = new BufferedReader(new InputStreamReader(in)); String s; while ((s = br readLine()) != null) System out println(s); }}public class test{ public static void main(String[] args) throws Exception { System out println( JavaCompiler测试成功java+编译器+代码! ); }}
编译成功的输出结果
编译成功
JavaCompiler测试成功
编译失败的输出结果
test java: : 找不到符号
符号 方法 printlnln(java lang String)
位置 类 java io PrintStream
System out printlnln( JavaCompiler测试成功! );
^
错误
编译失败
二 使用StandardJavaFileManager编译Java源程序
在第一部分我们讨论调用java编译器的最容易的方法 这种方法可以很好地工作 但它确不能更有效地得到我们所需要的信息 如标准的输入 输出信息 而在Java SE 中最好的方法是使用StandardJavaFileManager类 这个类可以很好地控制输入 输出 并且可以通过DiagnosticListener得到诊断信息 而DiagnosticCollector类就是listener的实现
使用StandardJavaFileManager需要两步 首先建立一个DiagnosticCollector实例以及通过JavaCompiler的getStandardFileManager()方法得到一个StandardFileManager对象 最后通过CompilationTask中的call方法编译源程序
在使用这种方法调用Java编译时最复杂的方法就是getTask 下面让我们讨论一下getTask方法 这个方法有如下所示的 个参数
getTask(Writer out JavaFileManager fileManager DiagnosticListener diagnosticListener Iterable options Iterable classes Iterable pilationUnits)
这些参数大多数都可为null 它们的含义所下
·out: 用于输出错误的流 默认是System err
·fileManager: 标准的文件管理
·diagnosticListener: 编译器的默认行为
·options: 编译器的选项
·classes 参与编译的class
最后一个参数pilationUnits不能为null 因为这个对象保存了你想编译的Java文件
在使用完getTask后 需要通过StandardJavaFileManager的getJavaFileObjectsFromFiles或getJavaFileObjectsFromStrings方法得到pilationUnits对象 调用这两个方法的方式如下
Iterable getJavaFileObjectsFromFiles(Iterable files)Iterable getJavaFileObjectsFromStrings(Iterable names)String[] filenames = …;Iterable pilationUnits =fileManager getJavaFileObjectsFromFiles(Arrays asList(filenames));JavaCompiler CompilationTask task = piler getTask(null fileManager diagnostics options null pilationUnits);最后需要关闭fileManager close();
下面是一个完整的演示程序
import java io *;import java util *;import javax tools *;public class test_pilerapi{ private static void pilejava() throws Exception { JavaCompiler piler = ToolProvider getSystemJavaCompiler(); // 建立DiagnosticCollector对象 DiagnosticCollector diagnostics = new DiagnosticCollector(); StandardJavaFileManager fileManager = piler getStandardFileManager(diagnostics null null); // 建立用于保存被编译文件名的对象 // 每个文件被保存在一个从JavaFileObject继承的类中 Iterable pilationUnits = fileManager getJavaFileObjectsFromStrings(Arrays asList( test java )); JavaCompiler CompilationTask task = piler getTask(null fileManager diagnostics null null pilationUnits); // 编译源程序 boolean success = task call(); fileManager close(); System out println((success)? 编译成功 : 编译失败 ); } public static void main(String args[]) throws Exception { pilejava(); }}
如果想得到具体的编译错误 可以对Diagnostics进行扫描 代码如下
for (Diagnostic diagnostic : diagnostics getDiagnostics())System out printf( Code: %s%n + Kind: %s%n + Position: %s%n + Start Position: %s%n + End Position: %s%n + Source: %s%n + Message: %s%n diagnostic getCode() diagnostic getKind() diagnostic getPosition() diagnostic getStartPosition() diagnostic getEndPosition() diagnostic getSource() diagnostic getMessage(null));被编译的test java代码如下 public class test{ public static void main(String[] args) throws Exception { aa; //错误语句 System out println( JavaCompiler测试成功! ); }}
在这段代码中多写了个aa 得到的编译错误为
Code: piler err not stmtKind: ERRORPosition: Start Position: End Position: Source: test javaMessage: test java: : 不是语句Success: false
通过JavaCompiler进行编译都是在当前目录下生成 class文件 而使用编译选项可以改变这个默认目录 编译选项是一个元素为String类型的Iterable集合 如我们可以使用如下代码在D盘根目录下生成 class文件
Iterable options = Arrays asList( d d:\\ );JavaCompiler CompilationTask task = piler getTask(null fileManager diagnostics options null pilationUnits);
在上面的例子中options处的参数为null 而要传递编译器的参数 就需要将options传入
有时我们编译一个Java源程序文件 而这个源程序文件需要另几个Java文件 而这些Java文件又在另外一个目录 那么这就需要为编译器指定这些文件所在的目录
Iterable options = Arrays asList( sourcepath d:\\src );
上面的代码指定的被编译Java文件所依赖的源文件所在的目录
lishixinzhi/Article/program/Java/hx/201311/27239
Q2: 怎么用记事本编写java
使用记事本编写Java程序需要遵循以下步骤java+编译器+代码:
1. 打开记事本软件java+编译器+代码;
2. 在空白文件中输入Java代码;
3. 保存文件时,选择“所有文件”类型,并将文件后缀名改为“.java”;
4. 打开命令行窗口,切换至程序所在目录;
5. 使用Javac编译器编译该Java程序;
6. 若编译成功,使用Java虚拟机运行该程序。
下面简单介绍这些步骤的具体操作java+编译器+代码:
1. 打开记事本软件java+编译器+代码:点击开始菜单,在“所有程序”中找到“附件”文件夹,然后单击“记事本”。
2. 输入Java代码:根据自己的需要,输入相应的Java代码。例如,可以尝试输入以下代码:
public class HelloWorld {
public static void main(String[] args) {
System.out.println(Hello, world!);
}
}
上述代码是经典的Java程序,其功能是在控制台窗口输出“Hello, world!”字符串。
3. 保存文件:在记事本软件中,选择“文件”-“另存为”,然后在弹出的“另存为”对话框中,选中“所有文件”类型,并将文件名改为“HelloWorld.java”。注意,Java程序的文件名必须与公共类的类名相同。
4. 打开命令行窗口:点击开始菜单,在“所有程序”中找到“附件”文件夹,然后单击“命令提示符”。
5. 切换至程序所在目录:在命令行窗口中,使用cd命令切换至Java程序所在的目录。
6. 编译Java程序:在命令行窗口中,输入以下命令:
javac HelloWorld.java
上述命令会使用Javac编译器编译HelloWorld.java文件。若编译成功,则会在当前目录下生成一个名为“HelloWorld.class”的字节码文件。
7. 运行Java程序:在命令行窗口中,输入以下命令:
java HelloWorld
上述命令会使用Java虚拟机运行HelloWorld.class文件。程序将在控制台窗口中输出“Hello, world!”字符串。
以上就是使用记事本编写Java程序的基本步骤。记住,在编写Java程序时,要注意语法和缩进等细节问题。
Q3: java中jdk提供的编译器是
在Java中,JDK(Java Development Kit)提供了名为javac的编译器,用于将Java源代码编译成字节码文件。Javac是Java编译器的一部分,它将Java源代码编译成Java字节码,并将字节码保存到.class文件中。Javac编译器是JDK自带的,可以在JDK安装目录的bin文件夹下找到。
使用Javac编译器编译Java代码时,需要在命令行中输入javac命令,后跟需要编译的Java源文件名,如下所示:
plaintext
Copy code
javac HelloWorld.java
其中,HelloWorld.java是要编译的Java源文件名。执行该命令后,Javac编译器将会编译HelloWorld.java文件,并生成名为HelloWorld.class的字节码文件。
关于java+编译器+代码和java编译器的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站。







