Java SE核心技术:反射机制、枚举类型与Lambda表达式详解

未分类2周前发布 gsjqwyl
11 0 0

文章大纲

🔍1. 反射机制剖析

Java反射技术赋予程序在运行时动态获取类信息的能力,无论类结构如何变化,都能实时获取其完整属性和方法定义,并实现动态调用。这项强大的特性为Java程序带来了极高的灵活性。

✒️1.1 反射核心类解析
类名称 功能说明
Class类 运行时表示类和接口的实体
Field类 封装类的成员变量信息
Method类 存储类的方法定义
Constructor 管理类的构造方法
##### ✒️1.2 Class类核心方法
方法 功能描述
—– —–
getClassLoader() 获取类加载器实例
getDeclaredClasses() 返回类包含的所有内部类和接口
forName() 通过类名获取Class对象
newInstance() 创建类的新实例
getName() 获取完整类路径
##### ✒️1.3 Field类操作指南
方法 功能说明
—– —–
getField() 获取指定公有字段
getFields() 获取所有公有字段
getDeclaredField() 获取指定字段(含私有)
getDeclaredFields() 获取全部字段(含私有)
##### ✒️1.4 Method类功能解析
方法 用途说明
—– —–
getDeclaredMethod() 获取特定方法
getDeclaredMethods() 获取所有方法
getMethod() 获取公有方法
getMethods() 获取全部公有方法
invoke() 执行目标方法
##### ✒️1.5 Constructor类应用
方法 功能描述
—– —–
getConstructor() 获取匹配的公有构造器
getConstructors() 获取所有公有构造器
getDeclaredConstructor() 获取指定构造器
getDeclaredConstructors() 获取全部构造器
##### ✒️1.6 三种Class对象获取方式
反射操作的首要步骤是获取目标类的Class对象实例
0. 定义示例学生类
public class Student {
private String name = "default";
public int age = 18;
public Student(){
System.out.println("默认构造器");
}
private Student(String name, int age) {
this.name = name;
this.age = age;
}
private void study(){
System.out.println("正在学习");
}
public void rest(){
System.out.println("休息中");
}
}
  1. Class.forName()方式
public class Demo1 {
public static void main(String[] args) throws Exception {
Class<?> clazz = Class.forName("com.example.Student");
}
}
  1. 类字面常量方式
public class Demo2 {
public static void main(String[] args) {
Class<?> clazz = Student.class;
}
}
  1. 实例getClass()方式
public class Demo3 {
public static void main(String[] args) {
Student s = new Student();
Class<?> clazz = s.getClass();
}
}
✒️1.7 反射实战应用
public class ReflectionDemo {
public static void main(String[] args) throws Exception {
// 获取Class实例
Class<?> clazz = Class.forName("com.example.Student");
Object instance = clazz.newInstance();
// 访问私有构造器
Constructor<?> constructor = clazz.getDeclaredConstructor(String.class, int.class);
constructor.setAccessible(true);
Object customInstance = constructor.newInstance("张三", 20);
// 调用私有方法
Method method = clazz.getDeclaredMethod("study");
method.setAccessible(true);
method.invoke(customInstance);
// 修改私有字段
Field field = clazz.getDeclaredField("name");
field.setAccessible(true);
field.set(customInstance, "李四");
}
}

🔍2. 枚举类型深度解析

枚举类型是JDK5引入的特殊类,继承自java.lang.Enum。它主要用于定义固定常量集合,如季节、月份等场景。

✒️2.1 枚举定义规范
访问修饰符 enum 枚举名 {
枚举项1,枚举项2,枚举项3;
}
✒️2.2 枚举应用场景
  1. switch-case应用
public enum Color {
RED, GREEN, BLUE;
public static void main(String[] args) {
Color color = Color.GREEN;
switch(color) {
case RED: System.out.println("红色"); break;
case GREEN: System.out.println("绿色"); break;
case BLUE: System.out.println("蓝色"); break;
}
}
}
  1. 常用方法
    方法 | 说明
    —–|—–
    values() | 返回枚举数组
    ordinal() | 获取枚举序号
    valueOf() | 字符串转枚举
    compareTo() | 比较枚举顺序
✒️2.3 枚举构造方法
public enum Season {
SPRING("春天"), SUMMER("夏天");
private String desc;
private Season(String desc) {
this.desc = desc;
}
}

🔍3. Lambda表达式精讲

Lambda表达式是Java8引入的函数式编程特性,可以简洁地表示匿名函数。

✒️3.1 Lambda语法规则
// 无参形式
() -> System.out.println("Hello")
// 单参数
x -> x * 2
// 多参数
(x,y) -> x + y
// 带类型声明
(int a, int b) -> a - b
✒️3.2 函数式接口

定义要求:
1. 接口必须只有一个抽象方法
2. @FunctionalInterface注解可选但推荐

@FunctionalInterface
interface Calculator {
int compute(int a, int b);
}
✒️3.3 变量捕获
public class LambdaDemo {
public static void main(String[] args) {
final int base = 10;
Calculator calc = (x,y) -> {
// base = 20; // 编译错误
return x * y + base;
};
}
}
© 版权声明

相关文章

暂无评论

暂无评论...