platform/incubation/reflection/doc/mirrors_comparison.md

210 lines
5.6 KiB
Markdown
Raw Normal View History

# Dart Mirrors vs Platform Reflection Comparison
## Core Features Comparison
| Feature | dart:mirrors | Platform Reflection | Notes |
|---------|-------------|-------------------|--------|
| **Library Reflection** |
| Top-level functions | ✅ Full | ✅ Full | Complete parity |
| Top-level variables | ✅ Full | ✅ Full | Complete parity |
| Library dependencies | ✅ Full | ✅ Full | Complete parity |
| URI resolution | ✅ Full | ✅ Full | Complete parity |
| Feature | dart:mirrors | Platform Reflection | Notes |
|---------|-------------|-------------------|--------|
| **Isolate Support** |
| Current isolate | ✅ Full | ✅ Full | Complete parity |
| Other isolates | ✅ Full | ✅ Full | Complete parity |
| Isolate control | ✅ Full | ✅ Full | Pause/Resume/Kill |
| Error handling | ✅ Full | ✅ Full | Error/Exit listeners |
| Feature | dart:mirrors | Platform Reflection | Notes |
|---------|-------------|-------------------|--------|
| **Type System** |
| Special types | ✅ Full | ✅ Full | void/dynamic/never |
| Type relationships | ✅ Full | ✅ Full | Complete type checking |
| Generic types | ✅ Full | ⚠️ Limited | Basic generic support |
| Type parameters | ✅ Full | ⚠️ Limited | Basic parameter support |
| Feature | dart:mirrors | Platform Reflection | Notes |
|---------|-------------|-------------------|--------|
| **Metadata System** |
| Class metadata | ✅ Full | ✅ Full | Complete parity |
| Method metadata | ✅ Full | ✅ Full | Complete parity |
| Property metadata | ✅ Full | ✅ Full | Complete parity |
| Parameter metadata | ✅ Full | ✅ Full | Complete parity |
| Custom attributes | ✅ Full | ✅ Full | Complete parity |
## Implementation Differences
### Registration System
```dart
// dart:mirrors
// No registration needed
@reflectable
class MyClass {}
// Platform Reflection
@reflectable
class MyClass {}
// Requires explicit registration
Reflector.register(MyClass);
Reflector.registerProperty(MyClass, 'prop', String);
Reflector.registerMethod(MyClass, 'method', [int]);
```
### Library Access
```dart
// dart:mirrors
final lib = MirrorSystem.findLibrary('my_lib');
// Platform Reflection
final lib = LibraryMirrorImpl.withDeclarations(
name: 'my_lib',
uri: Uri.parse('package:my_package/my_lib.dart'),
);
```
### Isolate Handling
```dart
// dart:mirrors
final mirror = reflect(isolate);
await mirror.invoke(#method, []);
// Platform Reflection
final mirror = IsolateMirrorImpl.other(isolate, 'name', lib);
mirror.addErrorListener((error, stack) {
// Handle error
});
```
### Type System
```dart
// dart:mirrors
final type = reflectType(MyClass);
final isSubtype = type.isSubtypeOf(otherType);
// Platform Reflection
final type = TypeMetadata(
type: MyClass,
name: 'MyClass',
// ...
);
final isSubtype = type.supertype == otherType;
```
## Performance Characteristics
| Aspect | dart:mirrors | Platform Reflection | Winner |
|--------|-------------|-------------------|---------|
| Startup time | ❌ Slower | ✅ Faster | Platform Reflection |
| Runtime performance | ❌ Slower | ✅ Faster | Platform Reflection |
| Memory usage | ❌ Higher | ✅ Lower | Platform Reflection |
| Tree shaking | ❌ Poor | ✅ Good | Platform Reflection |
## Platform Support
| Platform | dart:mirrors | Platform Reflection | Winner |
|----------|-------------|-------------------|---------|
| VM | ✅ Yes | ✅ Yes | Tie |
| Web | ❌ No | ✅ Yes | Platform Reflection |
| Flutter | ❌ No | ✅ Yes | Platform Reflection |
| AOT | ❌ No | ✅ Yes | Platform Reflection |
## Use Cases
| Use Case | dart:mirrors | Platform Reflection | Better Choice |
|----------|-------------|-------------------|---------------|
| Dependency injection | ✅ Simpler | ⚠️ More setup | dart:mirrors |
| Serialization | ✅ Simpler | ⚠️ More setup | dart:mirrors |
| Testing/Mocking | ✅ More flexible | ✅ More controlled | Depends on needs |
| Production apps | ❌ Limited platforms | ✅ All platforms | Platform Reflection |
## Migration Path
### From dart:mirrors
1. Add registration:
```dart
// Before
@reflectable
class MyClass {}
// After
@reflectable
class MyClass {}
void register() {
Reflector.register(MyClass);
// Register members...
}
```
2. Update reflection calls:
```dart
// Before
final mirror = reflect(instance);
final value = mirror.getField(#prop);
// After
final mirror = reflector.reflect(instance);
final value = mirror.getField(const Symbol('prop'));
```
3. Handle libraries:
```dart
// Before
final lib = MirrorSystem.findLibrary('my_lib');
// After
final lib = LibraryMirrorImpl.withDeclarations(
name: 'my_lib',
uri: uri,
);
```
## Trade-offs
### Advantages of Platform Reflection
1. Works everywhere
2. Better performance
3. Smaller code size
4. Better tree shaking
5. Full isolate support
6. Production-ready
### Advantages of dart:mirrors
1. No registration needed
2. Simpler API
3. More dynamic capabilities
4. Better for development tools
5. More flexible
## Conclusion
Platform Reflection offers a more production-ready alternative to dart:mirrors with:
- Full cross-platform support
- Better performance characteristics
- More controlled reflection surface
- Full isolate support
- Production-ready features
The main trade-off is the need for explicit registration, but this brings benefits in terms of performance, code size, and tree shaking.
Choose Platform Reflection when:
- You need cross-platform support
- Performance is critical
- Code size matters
- You want production-ready reflection
Choose dart:mirrors when:
- You're only targeting the VM
- Development time is critical
- You need maximum flexibility
- You're building development tools