最近,我正在读这篇文章.
根据那篇文章,Java Compiler即javac在生成字节码时不执行任何优化.这是真的吗?如果是这样,那么它可以作为中间代码生成器实现,以消除冗余并生成最佳代码吗?
javac是否有可能为以下过程生成无法访问的字节码?
public void ex06(String name) throws Exception {
File config = new File(name);
try (FileOutputStream fos = new FileOutputStream(config);
PrintWriter writer = new PrintWriter(new OutputStreamWriter(
fos , "rw"))) {
bar();
}
}
Run Code Online (Sandbox Code Playgroud)
当我查看字节码的异常表(javap -v)时,有以下条目看起来很奇怪:
43 48 86 Class java/lang/Throwable
43 48 95 any
Run Code Online (Sandbox Code Playgroud)
和
21 135 170 Class java/lang/Throwable
21 135 179 any
Run Code Online (Sandbox Code Playgroud)
现在的问题是,如果捕获了类型为"any"而不是Throwable的异常,则只能访问某些代码.有没有可能发生这种情况的情况?
======编辑======感谢目前为止的答案.让我给出另一个证据来表明我真的不理解异常处理:考虑以下过程
Object constraintsLock;
private String[] constraints;
private String constraint;
public void fp01() {
// Add this constraint to the set for our web application
synchronized (constraintsLock) …Run Code Online (Sandbox Code Playgroud) 以下示例描述了在Java 9之前生成以下代码行.
List data = new ArrayList<>();for (String b : data);
public class Test
{
public Test() {}
public static void main(String[] paramArrayOfString) throws IOException {
ArrayList localArrayList = new ArrayList();
String str;
for (Iterator localIterator = localArrayList.iterator(); localIterator.hasNext(); str = (String)localIterator.next()) {}
}
Run Code Online (Sandbox Code Playgroud)
在Java 10中,迭代器变量在for循环外部声明,并在操作结束后立即初始化为null值,因此GC可以清除未使用的内存.
{
Iterator iterator = data.iterator();
for (; iterator.hasNext();)
{
String b = (String)iterator.next();
}
b = null;
iterator = null;
}
Run Code Online (Sandbox Code Playgroud)
在for循环结束时,如何设置引用null明显优于引用超出范围.
资料来源:https://dzone.com/articles/features-in-java-10
此外,从评论中添加链接:https://bugs.openjdk.java.net/browse/JDK-8192858
我尝试新建一个内部静态类,但我发现字节码出现 jvm 指令ACONST_NULLbwteen NEW,DUP并且INVOKE_SPECIAL,但我知道一个类 new 是
package com.hoho.api;
/**
* @author linuxea
*/
public class Main {
private static class InnerMain {
// no field
}
public static void main(String[] args) {
InnerMain innerMain = new InnerMain();
}
}
Run Code Online (Sandbox Code Playgroud)
// class version 52.0 (52)
// access flags 0x21
public class com/hoho/api/Main {
// compiled from: Main.java
// access flags 0xA
private static INNERCLASS com/hoho/api/Main$InnerMain com/hoho/api/Main InnerMain
// access flags 0x1008 …Run Code Online (Sandbox Code Playgroud) java ×5
javac ×3
jvm ×3
bytecode ×1
inline ×1
jvm-bytecode ×1
optimization ×1
scala ×1
try-catch ×1