210 lines
5.6 KiB
Markdown
210 lines
5.6 KiB
Markdown
|
# 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
|