一、extendsion
void main(){
print('常规写函数方法: ${convertPointToUnit(3)}');
print('extension 用法:${3.pointToUnit}');
}
/// 通常的写法,封装转换方法
/// 给数字 加5 在整除2
int convertPointToUnit(int num) {
return (num + 5) ~/ 2;
}
/// 拓展写法 给int增加这样一个方法
extension _ExInt on int {
int get pointToUnit => (this + 5) ~/ 2;
}
打印输出:
二、call方法
void main(){
Person person = Person();
// 这样就会直接调用Person的call方法,注意必须名称为call,方法名为其他 会标红
var result = person("huahua", 13);
print('result => $result');
}
class Person {
late String name;
late int age;
int call(String name, int age) {
print('Name is $name ,Age is $age');
return 3;
}
}
打印输出:
三、noSuchMethod
/// noSuchMethod
/// java ---> noSuchMethodException
/// js ---> undefined
/// 在语言设计过程中,如果存在动态执行概念(如java的反射-找不到、js的dynamic)
void main() {
// var = 1 实在初始化阶段进行类型推断了
// dynamic 不做类型检查 直接提对应的熟悉,函数
dynamic object = 1;
// 次无效代码将调用整数1的noSuchMethod方法,其中Invocation表示.add(42)调用和参数 然后抛出
// 类可以覆盖 noSuchMethod 以为此类无效动态调用提供自定义行为
object.add(412);
}
打印输出:
可实现noSuchMethod,进行一些处理
void main() {
MockList().add(423);
print(MockList());
}
class MockList<T> implements List<T> {
@override
noSuchMethod(Invocation invocation) {
// invocation.noSuchMethod(invocation); 如果这么调用 就会像之前报错
print('找不到方法');
}
}
打印输出:
四、反射
import 'dart:mirrors';
/// 反射
/// 类加载
/// java --每个类身上都有标记 如 package xxx.xx.xxx
/// dart --动态类型的方案
void main() {
refClass();
}
void refClass() {
Symbol name = Symbol('A');
ClassMirror classMirror = reflectClass(A);
// 实例A类
var instance = classMirror.newInstance(Symbol.empty, [1]);
classMirror.declarations.forEach((key, value) {
print('${key} ==> ${value}');
});
// 获取 class 上的元数据
// classMirror.metadata.forEach((element) {
// print('${element.reflectee.who} ==> ${element.reflectee.what}');
// });
// instance.reflectee A对象,打印1
print(instance.reflectee.a);
}
class A{
int a;
A(this.a) {
print('$a');
}
}
运行结果:
五、注解
import 'dart:mirrors';
/// 反射
/// 类加载
/// java --每个类身上都有标记 如 package xxx.xx.xxx
/// dart --动态类型的方案
void main() {
refClass();
}
void refClass() {
Symbol name = Symbol('A');
// 实例A类
ClassMirror classMirror = reflectClass(A);
var instance = classMirror.newInstance(Symbol.empty, [1]);
// 获取 class 上的元数据,可以通过元数据来获取注解的信息
classMirror.metadata.forEach((element) {
print('${element.reflectee.who} ==> ${element.reflectee.what}');
});
// instance.reflectee A对象,打印1
// 如果reflectee使用了类中没有的方法 会报NoSuchMethod错误
print(instance.reflectee.a);
}
@Todo("类上的注解", "5")
class A{
int a;
A(this.a) {
print('实例化:$a');
}
}
class Todo {
final String who;
final String what;
const Todo(this.who, this.what);
}
运行结果: