Flutter 默认不支持传统 Java/C# 那样的运行时反射,因为 Dart 在编译为本地代码时会进行优化(如 Tree Shaking),反射会破坏这些优化。但可以通过以下方式实现类似功能:
1. 使用 dart:mirrors 库(仅支持 Dart VM)
import 'dart:mirrors';
class Person {
String name = "Alice";
void sayHello() => print("Hello, $name!");
}
void main() {
Person p = Person();
// 获取实例反射
InstanceMirror im = reflect(p);
// 访问字段
print(im.getField(#name).reflectee); // 输出: Alice
// 调用方法
im.invoke(#sayHello, []); // 输出: Hello, Alice!
}
注意:此方法在 Flutter(AOT 编译)中不可用,仅适用于 Dart 命令行应用。
2. 代码生成(推荐方案)
使用 json_serializable、built_value 等库,通过注解和 build_runner 在编译时生成代码:
# pubspec.yaml
dependencies:
json_annotation: ^4.8.1
dev_dependencies:
build_runner: ^2.4.4
json_serializable: ^6.7.0
// user.dart
import 'package:json_annotation/json_annotation.dart';
part 'user.g.dart';
@JsonSerializable()
class User {
final String name;
final int age;
User(this.name, this.age);
factory User.fromJson(Map<String, dynamic> json) => _$UserFromJson(json);
Map<String, dynamic> toJson() => _$UserToJson(this);
}
运行生成命令:
flutter pub run build_runner build
3. 手动映射
对于简单场景,可直接手动实现映射:
class User {
final String name;
final int age;
User.fromJson(Map<String, dynamic> json)
: name = json['name'],
age = json['age'];
Map<String, dynamic> toJson() => {
'name': name,
'age': age,
};
}
总结
- Flutter 生产环境:使用代码生成(方案 2)或手动映射(方案 3)
- 开发/测试:可在 Dart VM 环境使用
dart:mirrors(方案 1)
推荐优先选择代码生成方案,既能保证性能,又能减少手写重复代码的工作量。