Java内部类、foreach循环等语法糖javac到底优化了啥(反编译)

内部类(Inner Classes)、匿名内部类(Anonymous Inner Classes)和局部内部类(Local Inner Classes)是常见的语言特性。这些类为开发者提供了灵活的代码组织方式,使代码更加简洁和易读。

语法糖:通俗易懂的就是在原有语法基础上加入花活儿,通过改造编译器使得花活儿代码编译成已有代码,简化了书写,本质上.class里还是那些语法

匿名内部类:

java 复制代码
public class OuterClass {
    public OuterClass() {
    }
    public void createAnonymousClass() {
        Runnable var1 = new Runnable() {
            @Override
            public void run() {
                System.out.println("唱");
            }
        };
        Runnable var2 = new Runnable() {
            @Override
            public void run() {
                System.out.println("跳");
            }
        };
        Runnable var3 = new Runnable() {
            @Override
            public void run() {
                System.out.println("rap");
            }
        };
        new Thread(var1).start();
        Thread basketball = new Thread(() -> {
            System.out.println("篮球");
        });

    }
}

上面代码再熟悉不过了,编译后的class结构就如下,我们进行反编译这几个匿名内部类:

java 复制代码
class OuterClass$1 implements Runnable {
    OuterClass$1(final OuterClass this$0) {
        this.this$0 = this$0;
    }
    public void run() {
        System.out.println("唱");
    }
}
java 复制代码
class OuterClass$2 implements Runnable {
    OuterClass$2(final OuterClass this$0) {
        this.this$0 = this$0;
    }
    public void run() {
        System.out.println("跳");
    }
}
java 复制代码
class OuterClass$3 implements Runnable {
    OuterClass$3(final OuterClass this$0) {
        this.this$0 = this$0;
    }
    public void run() {
        System.out.println("rap");
    }
}

内部类:

java 复制代码
public class OuterClass {
    public OuterClass() {
    }
    
    public class InnerClass {
        public InnerClass() {
        }

        public void display() {
            System.out.println("内部类");
        }
    }
}

反编译:

java 复制代码
public class OuterClass$InnerClass {
    public OuterClass$InnerClass(final OuterClass this$0) {
        this.this$0 = this$0;
    }
    public void display() {
        System.out.println("内部类");
    }
}

局部内部类:

java 复制代码
public class OuterClass {
    public OuterClass() {
    }

 public void createLocalInnerClass() {
        class LocalInnerClass {
            public LocalInnerClass() {
            }

            public void show() {
                System.out.println("局部内部类");
            }
        }
        LocalInnerClass local = new LocalInnerClass();
        local.show();
    }
}

反编译:

java 复制代码
class OuterClass$1LocalInnerClass {
    public OuterClass$1LocalInnerClass(final OuterClass this$0) {
        this.this$0 = this$0;
    }
    public void show() {
        System.out.println("局部内部类");
    }
}

增强for循环:

java 复制代码
// 增强的for循环
    public void enhancedForLoop() {
        int[] numbers = {1, 2, 3, 4, 5};
        for (int number : numbers) {
            System.out.println("增强for循环输出: " + number);
        }
    }

编译后: 变成for i循环了

java 复制代码
public void enhancedForLoop() {
        int[] numbers = new int[]{1, 2, 3, 4, 5};
        int[] var2 = numbers;
        int var3 = numbers.length;
        for(int var4 = 0; var4 < var3; ++var4) {
            int number = var2[var4];
            System.out.println("增强for循环输出: " + number);
        }
    }

Lambda表达式

java 复制代码
public void lambdaExpression() {
        Runnable runnable = () -> System.out.println("使用Lambda表达式运行");
        runnable.run();
    }

反编译后:看着只是套了层括号

java 复制代码
public void lambdaExpression() {
        Runnable runnable = () -> {
            System.out.println("使用Lambda表达式运行");
        };
        runnable.run();
    }

自动装箱与拆箱

java 复制代码
public void autoBoxing() {
        Integer boxed = Integer.valueOf(1024);
        int unboxed = boxed;
        int a=1000;
        Integer b=a;
    }

反编译后:第一行Integer boxed = 1024;应该是编译器优化了

java 复制代码
public void autoBoxing() {
        Integer boxed = 1024;
        int unboxed = boxed;
        int a = 1000;
        Integer b = Integer.valueOf(a);
    }

菱形操作符

java 复制代码
public void diamondOperator() {
        Map<String, List<Integer>> map = new HashMap<>();
        map.put("键", Arrays.asList(1, 2, 3));
        System.out.println("菱形操作符输出: " + map);
    }

反编译后:

java 复制代码
public void diamondOperator() {
        Map<String, List<Integer>> map = new HashMap();
        map.put("键", Arrays.asList(1, 2, 3));
        System.out.println("菱形操作符输出: " + map);
    }

try-with-resources:

java 复制代码
public void tryWithResources() {
        try (BufferedReader reader = new BufferedReader(new FileReader("test.txt"))) {
            System.out.println("try-with-resources读取文件: " + reader.readLine());
        } catch (IOException e) {
            System.out.println("文件读取失败,错误信息: " + e.getMessage());
        }
    }
java 复制代码
public void tryWithResources() {
        try {
            BufferedReader reader = new BufferedReader(new FileReader("test.txt"));
            Throwable var2 = null;
            try {
                System.out.println("try-with-resources读取文件: " + reader.readLine());
            } catch (Throwable var12) {
                var2 = var12;
                throw var12;
            } finally {
                if (reader != null) {
                    if (var2 != null) {
                        try {
                            reader.close();
                        } catch (Throwable var11) {
                            var2.addSuppressed(var11);
                        }
                    } else {
                        reader.close();
                    }
                }
            }
        } catch (IOException var14) {
            IOException e = var14;
            System.out.println("文件读取失败,错误信息: " + e.getMessage());
        }
    }

方法引用:

java 复制代码
public void methodReference() {
        List<String> names = Arrays.asList("张三", "李四", "王五");
        System.out.println("方法引用输出:");
        names.forEach(System.out::println); // 方法引用
    }

反编译后:帮你取了

java 复制代码
public void methodReference() {
        List<String> names = Arrays.asList("张三", "李四", "王五");
        System.out.println("方法引用输出:");
        PrintStream var10001 = System.out;
        names.forEach(var10001::println);
    }

有迭代器的集合增强for循环

java 复制代码
public void iteratorLoop() {
        List<String> names = Arrays.asList("张三", "李四", "王五");
        for (String name : names) {
            System.out.println(name);
        }
    }

反编译后:

java 复制代码
public void iteratorLoop() {
        List<String> names = Arrays.asList("张三", "李四", "王五");
        Iterator var2 = names.iterator();
        while(var2.hasNext()) {
            String name = (String)var2.next();
            System.out.println(name);
        }
    }
相关推荐
程序员清风29 分钟前
阿里二面:Kafka 消费者消费消息慢(10 多分钟),会对 Kafka 有什么影响?
java·后端·面试
幼稚园的山代王29 分钟前
Prompt Enginering(提示工程)先进技术
java·人工智能·ai·chatgpt·langchain·prompt
周某某~38 分钟前
二.单例模式‌
java·单例模式·设计模式
摸鱼仙人~41 分钟前
深入理解Java单例模式:确保类只有一个实例
java·javascript·单例模式
SteveDraw44 分钟前
C++动态链接库封装,供C#/C++ 等编程语言使用——C++动态链接库概述(总)
开发语言·c++·c#·封装·动态链接库
十五年专注C++开发1 小时前
设计模式之单例模式(二): 心得体会
开发语言·c++·单例模式·设计模式
hstar95271 小时前
三十五、面向对象底层逻辑-Spring MVC中AbstractXlsxStreamingView的设计
java·后端·spring·设计模式·架构·mvc
flyair_China1 小时前
【云架构】
开发语言·php
pengyu1 小时前
【Java设计原则与模式之系统化精讲:壹】 | 编程世界的道与术(实战指导篇)
java·后端·设计模式
日月星辰Ace1 小时前
JVM 垃圾回收简介
java