文章大纲
- 🔍1. 反射机制剖析
- ✒️1.1 反射核心类解析
- ✒️1.2 Class类核心方法
- ✒️1.3 Field类操作指南
- ✒️1.4 Method类功能解析
- ✒️1.5 Constructor类应用
- ✒️1.6 三种Class对象获取方式
- ✒️1.7 反射实战应用
- 🔍2. 枚举类型深度解析
- ✒️2.1 枚举定义规范
- ✒️2.2 枚举应用场景
- ✒️2.3 枚举构造方法
- ✒️2.4 枚举与反射交互
- 🔍3. Lambda表达式精讲
- ✒️3.1 Lambda语法规则
- ✒️3.2 函数式接口详解
- ✒️3.3 变量捕获机制
🔍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("休息中");
}
}
- Class.forName()方式
public class Demo1 {
public static void main(String[] args) throws Exception {
Class<?> clazz = Class.forName("com.example.Student");
}
}
- 类字面常量方式
public class Demo2 {
public static void main(String[] args) {
Class<?> clazz = Student.class;
}
}
- 实例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 枚举应用场景
- 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;
}
}
}
- 常用方法
方法 | 说明
—–|—–
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;
};
}
}
© 版权声明
文章版权归作者所有,未经允许请勿转载。
相关文章
暂无评论...