Tag: reflection

C#Assembly.Load与Assembly.ReflectionOnlyLoad

我想了解Assembly.Load和Assembly.ReflectionOnlyLoad之间的区别。 在下面的代码中,我试图从一个给定的接口inheritance给定的程序集中的所有对象: var myTypes = new List<Type>(); var assembly = Assembly.Load("MyProject.Components"); foreach (var type in assembly.GetTypes()) { if (type.GetInterfaces().Contains(typeof(ISuperInterface))) { myTypes.Add(type); } } 这段代码对我来说工作正常,但是我正在对其他可能更好的替代方法进行一些研究,并且遇到了Assembly.ReflectionOnlyLoad()方法。 我认为,因为我没有加载或执行任何对象,基本上只是查询他们的定义,我可以使用ReflectionOnlyLoad稍微提高性能… 但事实certificate,当我将Assembly.Load更改为Assembly.ReflectionOnlyLoad时,它调用assembly.GetTypes()时出现以下错误: System.Reflection.ReflectionTypeLoadException: 无法加载一个或多个请求的types。 检索LoaderExceptions属性以获取更多信息。 我认为上面的代码只是做reflection和“看”图书馆……但是这是海森堡不确定性原理的某种实例,看图书馆和其中的对象实际上是试图实例化它们在一些办法? 谢谢,马克斯

Java 8 Lambdas上的reflectiontypes推断

我正在尝试Java 8中的新Lambdas,并且正在寻找一种在lambda类上使用reflection来获取lambda函数的返回types的方法。 我特别感兴趣的是lambda实现通用超接口的情况。 在下面的代码示例中, MapFunction<F, T>是通用超接口,我正在寻找一种方法来查找绑定到通用参数T 。 虽然Java在编译器之后丢弃了大量的genericstypes信息,但generics超类和generics超接口的子类(和匿名子类)却保留了这种types的信息。 通过reflection,这些types是可访问的。 在下面的例子(例1)中 ,reflection告诉我, MyMapper实现将java.lang.Integer绑定到genericstypes参数T 即使对于本身是generics的子类,也有一些方法可以找出与generics参数绑定的是什么,如果其他的已知的话。 在下面的例子中考虑情况2 ,其中F和T绑定到相同types的IdentityMapper 。 当我们知道的时候,如果我们知道参数typesT (在我的情况下,我们知道的话),我们知道typesF 现在的问题是,我怎样才能实现Java 8 lambdas类似的东西呢? 由于它们实际上不是generics超级界面的常规子类,因此上述方法不起作用。 具体来说,我可以找出parseLambda将java.lang.Integer绑定到T , identityLambda parseLambda绑定到F和T ? PS:理论上讲,应该可以反编译lambda代码,然后使用embedded式编译器(如JDT)并进入其types推断。 我希望有一个更简单的方法来做到这一点;-) /** * The superinterface. */ public interface MapFunction<F, T> { T map(F value); } /** * Case 1: A non-generic subclass. */ public class MyMapper implements […]

用于generics方法的GetMethod

我试图检索Enumerabletypes的Where方法的MethodInfo: typeof (Enumerable).GetMethod("Where", new Type[] { typeof(IEnumerable<>), typeof(Func<,>) }) 但是得到空。 我究竟做错了什么?

Javareflection:类字段和方法的顺序是否标准化?

在Java类上使用reflection来访问所有字段,方法等等: 这些元素是否有标准化的顺序 (在某些标准中有规定)? 当然,我可以凭经验来检查它,但是我需要知道它是否总是一样的。 编辑: 我等待的问题是:我需要什么命令;) 长话短说:我有JAXB注释的类,并且不想直观地表示这些类。 虽然XML属性的顺序既不与XML标准相关,也不与JAXB相关,但我希望具有特定顺序的可视化表示的XML属性。 例如:结束后开始。 这伤害了你的直觉。

范围覆盖存储切片的接口{}

鉴于你有一个接受t interface{}的函数的场景。 如果确定t是一个切片,我该如何在该切片上进行range ? 我不会在编译时知道传入的types,比如[]string , []int或[]MyType 。 func main() { data := []string{"one","two","three"} test(data) moredata := []int{1,2,3} test(data) } func test(t interface{}) { switch reflect.TypeOf(t).Kind() { case reflect.Slice: // how do I iterate here? for _,value := range t { fmt.Println(value) } } } Go Playground示例: http : //play.golang.org/p/DNldAlNShB

使用接受string参数的构造函数实例化一个类对象?

我想从它的Class对象实例化一个对象,使用接受一个String参数的构造函数。 这是一些代码,接近我想要的: Object object = null; Class classDefinition = Class.forName("javax.swing.JLabel"); object = classDefinition.newInstance(); 但是,它没有文本实例化JLabel对象。 我想使用接受一个string作为初始文本的JLabel构造函数。 有没有办法从一个Class对象中select一个特定的构造函数?

Scala:我如何dynamic实例化对象并使用reflection调用方法?

在Scala中,dynamic实例化对象并使用reflection调用方法的最佳方法是什么? 我想做下面的Java代码的Scala相当于: Class class = Class.forName("Foo"); Object foo = class.newInstance(); Method method = class.getMethod("hello", null); method.invoke(foo, null); 在上面的代码中,类名和方法名都是dynamic传入的。 上面的Java机制可能可以用于Foo和hello() ,但是Scalatypes不能与Java的一对一匹配。 例如,一个类可以被隐式地声明为一个单例对象。 另外Scala方法允许各种各样的符号成为它的名字。 两者都是通过名称修改来解决的。 请参阅Java和Scala之间的互操作 。 另一个问题似乎是通过解决重载和自动装箱参数的匹配问题,在Scala的反思 – 天堂与地狱中描述 。

如何检查是否公开

给定一个PropertyInfo对象,如何检查该属性的setter是否公开?

从C#中的基类,获得派生types?

假设我们有这两个类: public class Derived : Base { public Derived(string s) : base(s) { } } public class Base { protected Base(string s) { } } 如何从Base的构造函数中发现Derived是调用者? 这就是我想到的: public class Derived : Base { public Derived(string s) : base(typeof(Derived), s) { } } public class Base { protected Base(Type type, string s) { } } 有没有另外一种方式,不需要传递typeof(Derived) […]

查找两个C#对象之间的属性差异

我正在处理的项目需要一些简单的审计日志logging,以便用户更改他们的电子邮件,帐单地址等。我们正在使用的对象来自不同的来源,一个是WCF服务,另一个是Web服务。 我已经实现了使用reflection的以下方法来查找对两个不同对象的属性的更改。 这会生成一个与旧的和新的值有差异的属性列表。 public static IList GenerateAuditLogMessages(T originalObject, T changedObject) { IList list = new List(); string className = string.Concat("[", originalObject.GetType().Name, "] "); foreach (PropertyInfo property in originalObject.GetType().GetProperties()) { Type comparable = property.PropertyType.GetInterface("System.IComparable"); if (comparable != null) { string originalPropertyValue = property.GetValue(originalObject, null) as string; string newPropertyValue = property.GetValue(changedObject, null) as string; if (originalPropertyValue != […]