今天继续讲Java中的类加载器和lambda表达式的知识!
当程序要使用某个类时,如果该类还未被加载到内存中,则系统会通过加载、连接、初始化三步来实现对这个类进行初始化。
加载
将 .class
文件读入内存,并为之创建一个 Class
对象。任何类被使用时系统都会建立一个 Class
对象。
连接
初始化
执行类的静态初始化器和静态代码块。
java.lang.Class
对象。java.exe
命令运行某个主类。负责将 .class
文件加载到内存中,并为之生成对应的 Class
对象。了解类加载机制可以帮助更好地理解程序的运行。
Bootstrap ClassLoader(根类加载器)
负责加载 Java 核心类,如 System
、String
等。它在 JDK 的 JRE lib
目录下的 rt.jar
文件中。
Extension ClassLoader(扩展类加载器)
负责加载 JRE 扩展目录中的 JAR 包。在 JDK 的 JRE lib
目录下的 ext
目录中。
System ClassLoader(系统类加载器)
负责加载来自 java
命令的 .class
文件,以及 classpath
环境变量所指定的 JAR 包和类路径。
Java 反射机制允许在运行时动态获取类的信息以及调用对象的方法。
获取构造方法
getConstructors()
getDeclaredConstructors()
创建对象
con.newInstance("zhangsan", 20);
获取所有成员
getFields()
getDeclaredFields()
获取单个成员
getField()
getDeclaredField()
修改成员的值
field.set(obj, value);
获取所有方法
getMethods()
getDeclaredMethods()
获取单个方法
getMethod()
getDeclaredMethod()
暴力访问
method.setAccessible(true);
从 JDK 1.8 开始,Lambda 表达式简化了代码开发,支持函数式编程。
Lambda 表达式由 ->
操作符分隔为两部分:
return
和大括号都可以省略。Predicate
:断言型接口
@FunctionalInterface
public interface Predicate {
boolean test(T t);
}
Function
:函数型接口
@FunctionalInterface
public interface Function {
R apply(T t);
}
Supplier
:供给型接口
@FunctionalInterface
public interface Supplier {
T get();
}
Consumer
:消费型接口
@FunctionalInterface
public interface Consumer {
void accept(T t);
}
对象的方法引用
对象引用::方法名
静态方法引用
类名::静态方法名
构造方法引用
类名::new
数组创建引用
元素类型[]::new
Lambda 表达式底层被封装成了主类的一个私有方法,并通过 invokedynamic
指令进行调用,简化了匿名内部类的写法。Lambda 表达式使代码更简洁,但也可能降低可读性。
优点:
缺点:
参与评论
手机查看
返回顶部