本文目录
- c# 动态编译
- C#中 什么是反射机制
- 什么是反射
- C#中反射如何应用
- C#中Typeof是干什么的
- 概述反射和序列化
- java文件是怎么执行的
- typeof(class)
c# 动态编译
要用到C#的编译器、反射功能,自己瞧着去吧using System;using Microsoft.CSharp;using System.CodeDom.Compiler;using System.Reflection;public class Example{ static void Main() { CSharpCodeProvider provider = new CSharpCodeProvider(); CompilerParameters parameter = new CompilerParameters(); parameter.ReferencedAssemblies.Add(“System.dll“); parameter.GenerateExecutable = false; parameter.GenerateInMemory = true; CompilerResults result = provider.CompileAssemblyFromSource(parameter, CreateCode(“256*56*(145+56.0*254/345)“));//将你的式子放在这里 if (result.Errors.Count 》 0) { Console.WriteLine(“动态编译出错了!“); } else { Assembly assembly = result.CompiledAssembly; Type AType = assembly.GetType(“ANameSpace.AClass“); MethodInfo method = AType.GetMethod(“AFunc“); Console.WriteLine(method.Invoke(null, null)); } Console.Read(); } static string CreateCode( string para) { return “using System; namespace ANameSpace{static class AClass{public static object AFunc(){return “+para+“;}}}“; }}
C#中 什么是反射机制
.Net Framework 中提供了反射机制,可以再加载程序运行时,动态获取和加载程序集,并且可以获取到程序集的信息在程序集中,包含模块(Module),模块包含类型,类型包含成员,提供反射,我们可以查看到一个程序集的路径,命名空间,类。我们还可以对其进行操作可以对程序集的类进行实例化,掉用类中的方法等,就跟我们普通使用程序集一样反射机制通常有下面一些用途使用 Assembly 定义和加载程序集,加载在程序集清单中列出的模块,以及从此程序集中查找类型并创建该类型的实例。使用 Module 发现以下信息:包含模块的程序集以及模块中的类等。 您还可以获取在模块上定义的所有全局方法或其他特定的非全局方法。使用 ConstructorInfo 发现以下信息:构造函数的名称、参数、访问修饰符(如 public 或 private)和实现详细信息(如 abstract 或 virtual)等。 使用 Type 的 GetConstructors 或 GetConstructor 方法来调用特定的构造函数。使用 MethodInfo 发现以下信息:方法的名称、返回类型、参数、访问修饰符(如 public 或 private)和实现详细信息(如 abstract 或 virtual)等。 使用 Type 的 GetMethods 或 GetMethod 方法来调用特定的方法。使用 FieldInfo 发现以下信息:字段的名称、访问修饰符(如 public 或 private)和实现详细信息(如static)等;并获取或设置字段值。使用 EventInfo 发现以下信息:事件的名称、事件处理程序数据类型、自定义特性、声明类型和反射类型等;并添加或移除事件处理程序。使用 PropertyInfo 发现以下信息:属性的名称、数据类型、声明类型、反射类型和只读或可写状态等;并获取或设置属性值。使用 ParameterInfo 发现以下信息:参数的名称、数据类型、参数是输入参数还是输出参数,以及参数在方法签名中的位置等。当您在一个应用程序域的仅反射上下文中工作时,请使用 CustomAttributeData 来发现有关自定义特性的信息。 通过使用 CustomAttributeData,您不必创建特性的实例就可以检查它们。微软官方解释:https://msdn.microsoft.com/library/windows/apps/f7ykdhsy.aspx
什么是反射
反射《生理》反射(fanshe)在中枢神经系统参与下,机体对内外环境刺激所作出的规律性反应。反射活动的结构基础是反射弧。高等动物和人的反射有两种:一种是在系统发育过程中形成并遗传下来,因而生来就有的先天性反射,称非条件反射。它是由于直接刺激感受器而引起的,通过大脑皮质下各中枢完成的反射。另一种是条件反射,是动物个体在生活过程中适应环境变化,在非条件反射基础上逐渐形成的后天性反射。它是由信号刺激引起,在大脑皮质的参与下形成的。根据结构基础的不同,又可把反射分为简单和复杂的两种。最简单的反射是单突触反射。复杂的反射,是神经中枢分布较广,靠联络神经元组成复杂的链锁。反射是实现机能调节的基本方式。反射弧中任何一部位被破坏,反射就不能实现。由于突触在结构与功能上的特性,决定了反射弧上冲动的传导只能由感受器传向效应器。反射《物理》声波、光波或其他电磁波遇到障碍物或别种媒质面而折回反射《生物》有机体通过神经系统,对于刺激所产生的反应反反射《编程》程序集包含模块,而模块包含类型,类型又包含成员。反射则提供了封装程序集、模块和类型的对象。您可以使用反射动态地创建类型的实例,将类型绑定到现有对象,或从现有对象中获取类型。然后,可以调用类型的方法或访问其字段和属性。反射通常具有以下用途: 1.使用 Assembly 定义和加载程序集,加载在程序集清单中列出的模块,以及从此程序集中查找类型并创建该类型的实例。 2.使用 Module 了解如下的类似信息:包含模块的程序集以及模块中的类等。您还可以获取在模块上定义的所有全局方法或其他特定的非全局方法。 3.使用 ConstructorInfo 了解如下的类似信息:构造函数的名称、参数、访问修饰符(如 public 或 private)和实现详细信息(如 abstract 或 virtual)等。4.使用 Type 的 GetConstructors 或 GetConstructor 方法来调用特定的构造函数。 5.使用 MethodInfo 来了解如下的类似信息:方法的名称、返回类型、参数、访问修饰符(如 public 或 private)和实现详细信息(如 abstract 或 virtual)等。使用 Type 的 GetMethods 或 GetMethod 方法来调用特定的方法。 6.使用 FieldInfo 来了解如下的类似信息:字段的名称、访问修饰符(如 public 或 private)和实现详细信息(如 static)等;并获取或设置字段值。 7.使用 EventInfo 来了解如下的类似信息:事件的名称、事件处理程序数据类型、自定义属性、声明类型和反射类型等;并添加或移除事件处理程序。 8.使用 PropertyInfo 来了解如下的类似信息:属性的名称、数据类型、声明类型、反射类型和只读或可写状态等;并获取或设置属性值。 9.使用 ParameterInfo 来了解如下的类似信息:参数的名称、数据类型、参数是输入参数还是输出参数,以及参数在方法签名中的位置等。
C#中反射如何应用
我们写代码,是面向功能的,比方说, Math.Add(x, y)返回x y之和。但是有时候我们希望给代码附加一些特殊属性,而这些属性可能跟功能关系不大。比方说,我们希望Math.Add()能够作为Web服务的方法被调用。为了解决这个问题,.NET就提出Attribute(属性)概念,你可以写 [WebMethod] public int Add(int x, int y) { //... } 这样编译器在编译Add方法的时候,同时也会把[WebMethod]这个附加的属性也生成并注入到编译结果(程序集)的特定区域,我们称它为元数据区域。这样ASP.NET就可以在运行时扫描属性数据,识别各种Web方法并产生正确的WSDL文档。属性就是一种元数据(所谓元数据,就是描述数据的数据)。其他的元数据包括类型列表,继承关系,接口列表,等等…… 光生成和存储是不够的,我们还要能读取识别元数据,反射就可以干这个,在运行时反射系统可以允许你读取所有的元数据并加以利用(比如,找到一个类的集成树)…… 元数据是描述程序集内部数据的词典,反射是帮你查词典的工具。
C#中Typeof是干什么的
MSDN上typeof的说明:“用于获取类型的 System.Type 对象。”
typeof是操作符(一些书叫运算符),这点很重要。在C#中所有的操作符最后都变为函数了。这也就不奇怪为什么一个看似函数的东西却被称为操作符的原因了。
注意返回的是Type对象,内含有许多信息。如类型的信息。方法有哪些,属性有哪些,字段有哪些。如果用其它的技术,如反射、序列化什么的,配合使用的话会更方便。
扩展资料
typeof(x)中的x,必须是具体的类名、类型名称等,不可以是变量名称。
GetType()方法继承于Object(C#中所有类的基类都是object类。基类是相对于派生类而言的,比方说:如果B类继承自A类,则A就是B的基类。),所以C#中任何对象都具有GetType()方法,它的作用和typeof()相同,返回Type类型的当前对象的类型。
举例说明:
有这样一个变量i: Int32 i = new Int32();
i.GetType()返回值是Int32的类型,但是无法使用typeof(i),因为i是一个变量。如果要使用typeof(),则只能:typeof(Int32),返回的同样是Int32的类型。
Typeof()是运算符,用于获取类型的 System.Type 对象。而GetType是方法,获取当前实例的类型;Typeof()的参数只能是int,string,String,自定义类型,且不能是实例;
概述反射和序列化
反射和序列化是不同的。反射:程序集包含模块,而模块包含类型,类型又包含成员。反射则提供了封装程序集、模块和类型的对象。您可以使用反射动态地创建类型的实例,将类型绑定到现有对象,或从现有对象中获取类型。然后,可以调用类型的方法或访问其字段和属性 序列化:序列化是将对象转换为容易传输的格式的过程。例如,可以序列化一个对象,然后使用 HTTP 通过 Internet 在客户端和服务器之间传输该对象。在另一端,反序列化将从该流重新构造对象。
java文件是怎么执行的
首先:使用javac命令把.java文件编译成.class文件(字节码文件)然后:JVM(java虚拟机)装载.class文件并翻译成机器码后运行java程序;共同学习-----请参考:我们手工执行java程序是这样的:1 在记事本中或者是UE的文本编辑器中,写好源程序;2 使用javac命令把源程序编译成.class文件; 编译后的.class(类字节码)文件中会包含以下内容:ConstantPool:符号表;FieldInfo:类中的成员变量信息;MethodInfo:类中的方法描述;Attribute:可选的附加节点。FieldInfo节点包含成员变量的名称,诸如public,private,static等的标志。ConstantValue属性用来存储静态的不变的成员变量的值。Deprecated和Synthetic被用来标记一个成员变量是不被推荐的或由编译器生成的。3 有了.class文件,我们执行 java 解释命令就可以运行java程序了。现在我们主要讨论一下,当执行 java这个命令后,会发生什么事情呢?首先,JVM装载.class,也就是类装载器装载类字节码。一个类装载器本身也是一个java类,所以,类装载器自身也需要被另外一个类装载器装载,这就出现了类似先有蛋,还是先有鸡的问题。但JAVA中的类装载器的这个问题却很容易解决。JAVA的虚拟机(JVM)中内嵌了一个称为Bootstrap类装载器,它是用特定于操作系统的本地代码实现的,属于JAVA虚拟机的内核,Bootstrap类不用专门的类装载器去进行装载。Bootstrap类负责加载JAVA核心包中的类(即rt.jar文件中的类),这些类的Class.getClassLoader()方法返回值为null,即表示是Bootstrap类装载器。JAVA核心包中有另外两个类装载器:ExtClassLoader和AppClassLoader,它们都是用JAVA语言编写的JAVA类,其中ExtClassLoader类装载负责加载存放在《JAVA_HOME》/jre/lib/ext目录下的jar包中的类,AppClassLoader负责加载应用程序的启动执行类,即当使用java命令去启动执行一个类时,JAVA虚拟机使用AppClassLoader加载这个类。在编译和运行JAVA程序时,都会通过ExtClassLoader类装载器去《JAVA_HOME》/jre/lib/ext目录下的JAR包中搜索要加载的类,所以,如果将包含例如Servlet API的jar包或者是javamail.jar包复制到该目录下,在编译Servlet或JavaMail程序时,就不必在CLASSPATH环境变量中增加包含Servlet API的jar包或者是javamail.jar包文件。以上,就是一个JAVA程序执行的大致过程。
typeof(class)
用于获取类型的 System.Type 对象。 typeof 表达式采用以下形式:复制System.Type type = typeof(int);备注若要获取表达式的运行时类型,可以使用 .NET Framework 方法 GetType,如以下示例中所示:复制int i = 0;System.Type type = i.GetType();不能重载 typeof 运算符。typeof 运算符也能用于公开的泛型类型。 具有不止一个类型参数的类型的规范中必须有适当数量的逗号。 下面的示例演示如何确定方法的返回类型是否是泛型 IEnumerable《T》。 假定此方法是 MethodInfo 类型的实例:复制string s = method.ReturnType.GetInterface (typeof(System.Collections.Generic.IEnumerable《》).FullName);示例C#复制public class ExampleClass{ public int sampleMember; public void SampleMethod() {} static void Main() { Type t = typeof(ExampleClass); // Alternatively, you could use // ExampleClass obj = new ExampleClass(); // Type t = obj.GetType(); Console.WriteLine(“Methods:“); System.Reflection.MethodInfo methodInfo = t.GetMethods(); foreach (System.Reflection.MethodInfo mInfo in methodInfo) Console.WriteLine(mInfo.ToString()); Console.WriteLine(“Members:“); System.Reflection.MemberInfo memberInfo = t.GetMembers(); foreach (System.Reflection.MemberInfo mInfo in memberInfo) Console.WriteLine(mInfo.ToString()); }}/* Output: Methods: Void SampleMethod() System.String ToString() Boolean Equals(System.Object) Int32 GetHashCode() System.Type GetType() Members: Void SampleMethod() System.String ToString() Boolean Equals(System.Object) Int32 GetHashCode() System.Type GetType() Void .ctor() Int32 sampleMember*/此示例使用 GetType 方法确定用来包含数值计算的结果的类型。 这取决于结果数字的存储要求。C#复制class GetTypeTest{ static void Main() { int radius = 3; Console.WriteLine(“Area = {0}“, radius * radius * Math.PI); Console.WriteLine(“The type is {0}“, (radius * radius * Math.PI).GetType() ); }}