AssemblyBuilderAccess.Run); var moduleBuilder = assemblyBuilder.DefineDynamicModule("Proxy.dll"); var typeBuilder FoobarProxy", TypeAttributes.Public, null, new Type[] { typeof(IFoobar) }); var targetField = typeBuilder.DefineField MethodAttributes.NewSlot | MethodAttributes.Virtual | MethodAttributes.Final; var invokeMethod = typeBuilder.DefineMethod OpCodes.Callvirt, typeof(IFoobar).GetMethod("Invoke")); il.Emit(OpCodes.Ret); return typeBuilder.CreateType il.Emit(OpCodes.Call, typeof(Foobar).GetMethod("Invoke")); il.Emit(OpCodes.Ret); return typeBuilder.CreateType
todo(after the paramTypes were set to the invocation. we should change this implementation) typeBuilder strings.Builder{} builder.WriteString(reflect.ValueOf(invocation.Arguments()[0]).String()) typeBuilder.WriteString builder.WriteString(",") builder.WriteString(reflect.ValueOf(arg).String()) typeBuilder.WriteString (",") typeBuilder.WriteString(reflect.TypeOf(arg).Name()) } dataMap[Arguments ] = builder.String() dataMap[Types] = typeBuilder.String() } return dataMap } buildAccessLogData
ModuleBuilder modulebuilder = assemblyBuilder.DefineDynamicModule("MyModal"); //托管模块 TypeBuilder typebuilder = modulebuilder.DefineType("MyDynamicType", TypeAttributes.Public); Type type = typebuilder.CreateType(); Emit 定义字段、构造函数 // 在Type中生成公有字段 FieldBuilder fieldBuilder = typebuilder.DefineField("NumberField", typeof(int), FieldAttributes.Public); // 定义一个接受整数参数的构造函数 Type[] parameterTypes = { typeof(int) }; ConstructorBuilder ctor1 = typebuilder.DefineConstructor
我们用一点反射和一点Emit,来完成这个过程: 反射得到构造函数和属性定义: //得到类型生成器 TypeBuilder typeBuilder (targetType); //定义构造函数 BuildConstructor(typeBuilder, newTypeParent, targetType.Name MethodAttributes.Final; //构造Get访问器 MethodBuilder getPropMethodBuilder = typeBuilder.DefineMethod getPropMethodBuilder); //构造Set访问器 MethodBuilder setPropMethodBuilder = typeBuilder.DefineMethod SetFieldNamesBuilder, propertyNames.ToArray()); //真正创建,并返回 Type resuleType=typeBuilder.CreateType
结尾,从下表中我们可以看的非常清楚 元素中文 元素名称 对应Emit构建器名称 程序集 Assembly AssemblyBuilder 模块 Module ModuleBuilder 类 Type TypeBuilder AssemblyBuilderAccess.Run); var moduleBuilder = assemblyBuilder.DefineDynamicModule("Edwin.Blog.Emit"); var typeBuilder (barType); //实现接口 typeBuilder.AddInterfaceImplementation(interfaceType.MakeGenericType(genericTypeBuilder )); (6) 定义字段,因为字段在构造器值需要使用,故先创建 //定义字段 var fieldBuilder = typeBuilder.DefineField("_name", genericTypeBuilder , FieldAttributes.Private); (7) 定义构造器,并编写内部逻辑 //定义构造器 var ctorBuilder = typeBuilder.DefineConstructor
构造一个类型构造器, // create type builder for a class var typeBuilder = moduleBuilder.DefineType("HelloKittyClass // create method builder var methodBuilder = typeBuilder.DefineMethod( "SayHelloMethod", MethodAttributes.Public throw it. il.Emit(OpCodes.Ret); 创建类型, // then create the whole class type var helloKittyClassType = typeBuilder.CreateType HelloKittyClass", TypeAttributes.Public); // create method builder var methodBuilder = typeBuilder.DefineMethod il.Emit(OpCodes.Ret); // then create the whole class type var helloKittyClassType = typeBuilder.CreateType
typeBuilder; if (inheritMode) { typeBuilder = moduleBuilder.DefineType TypeAttributes.Public, null, new[] { InterfaceType }); } InjectInterceptor(typeBuilder , ImpType, InterceptType, inheritMode, isInterceptAllMethod); var t = typeBuilder.CreateType return Activator.CreateInstance(t); } private static void InjectInterceptor(TypeBuilder typeBuilder, Type ImpType, Type InterceptType, bool inheritMode, bool isInterceptAllMethod)
todo(after the paramTypes were set to the invocation. we should change this implementation) typeBuilder strings.Builder{} builder.WriteString(reflect.ValueOf(invocation.Arguments()[0]).String()) typeBuilder.WriteString builder.WriteString(",") builder.WriteString(reflect.ValueOf(arg).String()) typeBuilder.WriteString (",") typeBuilder.WriteString(reflect.TypeOf(arg).Name()) } dataMap[Arguments ] = builder.String() dataMap[Types] = typeBuilder.String() } return dataMap } buildAccessLogData
: typeBuilder = moduleBuilder.DefineType( nameOfType, TypeAttributes.Public, ImpType) ; 实现接口方式声明TypeBuilder typeBuilder = moduleBuilder.DefineType( nameOfType, TypeAttributes.Public 如果是继承方式,ImpType与InterfaceType类型一致,声明完这个类,接下来我们就需要对这个类的内容进行完善,先上代码 private static void InjectInterceptor(TypeBuilder typeBuilder, Type ImpType, Type InterceptType, bool inheritMode, bool isInterceptAllMethod) { // ---- 变量定义 ---- var constructorBuilder = typeBuilder.DefineConstructor(
AssemblyBuilderAccess.Run); var moduleBuilder = assemblyBuilder.DefineDynamicModule("Proxy.dll"); var typeBuilder FoobarProxy", TypeAttributes.Public, null, new Type[] { typeof(IFoobar) }); var targetField = typeBuilder.DefineField ", typeof(IFoobar), FieldAttributes.Private | FieldAttributes.InitOnly); var constructor = typeBuilder.DefineConstructor MethodAttributes.NewSlot | MethodAttributes.Virtual | MethodAttributes.Final; var invokeMethod = typeBuilder.DefineMethod OpCodes.Callvirt, typeof(IFoobar).GetMethod("Invoke")); il.Emit(OpCodes.Ret); return typeBuilder.CreateType
1//写入java文 2try { 3 JavaFile.builder(packageName, typeBuilder.build()).build().writeTo(mFiler) 4} { 5 mMessager.printMessage(Diagnostic.Kind.ERROR, e.getMessage(), typeElement); 6} 代码中的JavaFile与typeBuilder packageName, 9 NameUtils.getAutoGeneratorTypeName(typeName)); 10 11//构建自动生成的类 12TypeSpec.Builder typeBuilder -> name, $T -> type(ClassName), $L -> literals 有了上面的理解我们再来看下面的生成代码: 1//构建自动生成的类 2TypeSpec.Builder typeBuilder 最后分别向bindView方法中添加findViewById与setText代码块,同时将定义的方法添加到typeBuilder中。
var moduleBuilder = assemblyBuilder.DefineDynamicModule(clazz.ModuleName); var typeBuilder var typee = item.Type; //define field var fieldBuilder = typeBuilder.DefineField PropertyAttributes.SpecialName, typee, Type.EmptyTypes); //define getter var getPropMthdBldr = typeBuilder.DefineMethod getIL.Emit(OpCodes.Ret); //define setter var setPropMthdBldr = typeBuilder.DefineMethod propBuilder.SetSetMethod(setPropMthdBldr); } //create type var type = typeBuilder.CreateType
ModuleBuilder.DefineType:定义类型 往下看就是一个TypeBuilder.DefineConstructor 向动态类型添加一个新的构造函数。 https://docs.microsoft.com/en-us/dotnet/api/system.reflection.emit.typebuilder.definemethod? view=netcore-3.1#System_Reflection_Emit_TypeBuilder_DefineMethod_System_String_System_Reflection_MethodAttributes_System_Reflection_CallingConventions_System_Type_System_Type
assemblyBuilder.DefineDynamicModule("Artech.EmitVsExpression", "Artech.EmitVsExpression.dll"); 6: var typeBuilder methodBuilder); 13: 14: //SetPropertyValueViaExpression 15: methodBuilder = typeBuilder.DefineMethod CompileToMethod(methodBuilder); 20: 21: //GetPropertyValueViaEmit 22: methodBuilder = typeBuilder.DefineMethod ilGenerator.Emit(OpCodes.Ret); 27: 28: //SetPropertyValueViaEmit 29: methodBuilder = typeBuilder.DefineMethod OpCodes.Callvirt, property.GetSetMethod(), null); 34: ilGenerator.Emit(OpCodes.Ret); 35: 36: typeBuilder.CreateType
if (_parameters == null || _parameters.Length == 0) 2 { 3 return typeBuilder MethodAttributes.SpecialName | MethodAttributes.RTSpecialName | MethodAttributes.Public; 11 var constructor = typeBuilder.DefineConstructor il.Emit(OpCodes.Call, baseConstructor); 23 il.Emit(OpCodes.Ret); 24 25 return typeBuilder
NameUtils.getAutoGeneratorTypeName(typeName)); //构建自动生成的类 TypeSpec.Builder typeBuilder Modifier.PUBLIC) .addAnnotation(Keep.class); //添加构造方法 typeBuilder.addMethod bindView.value()[1]); } } typeBuilder.addMethod //写入java文件 try { JavaFile.builder(packageName, typeBuilder.build
response = new Response<>(); response.setData("test generic"); Type<Response<String>> fromType = new TypeBuilder <Response<String>>() {}.build(); Type<ResponseDto<String>> toType = new TypeBuilder<ResponseDto<String person.setName("test generic"); response.setData(person); Type<Response<Person>> fromType = new TypeBuilder <Response<Person>>() {}.build(); Type<Response<PersonDto>> toType = new TypeBuilder<Response<PersonDto
System.Reflection.Emit.AssemblyBuilderAccess]::Run) $ModuleBuilder = $AssemblyBuilder.DefineDynamicModule('InMemoryModule', $false) $TypeBuilder Class, Public, Sealed, AnsiClass, AutoClass', [System.MulticastDelegate]) $ConstructorBuilder = $TypeBuilder.DefineConstructor $Parameters) $ConstructorBuilder.SetImplementationFlags('Runtime, Managed') $MethodBuilder = $TypeBuilder.DefineMethod $Parameters) $MethodBuilder.SetImplementationFlags('Runtime, Managed') Write-Output $TypeBuilder.CreateType
System.Reflection.Emit.AssemblyBuilderAccess]::Run) $ModuleBuilder = $AssemblyBuilder.DefineDynamicModule('InMemoryModule', $false) $TypeBuilder Class, Public, Sealed, AnsiClass, AutoClass', [System.MulticastDelegate]) $ConstructorBuilder = $TypeBuilder.DefineConstructor $Parameters) $ConstructorBuilder.SetImplementationFlags('Runtime, Managed') $MethodBuilder = $TypeBuilder.DefineMethod Virtual', $ReturnType, $Parameters) $MethodBuilder.SetImplementationFlags('Runtime, Managed') $TypeBuilder.CreateType
ServiceProfile } // 关键点3: 定义一系列构建属性的fluent接口,通过方法的返回值控制属性的构建顺序 idBuilder interface { WithId(id string) typeBuilder } typeBuilder interface { WithType(svcType ServiceType) statusBuilder } statusBuilder interface 关键点5: 为Builder定义一系列构建方法,也即实现关键点3中定义的Fluent接口 func (f *fluentServiceProfileBuilder) WithId(id string) typeBuilder 比如 WithId 方法的返回值是 typeBuilder 类型,表示紧随其后的就是 WithType 方法。