标签: reflection

使用Razor/MVC3将AssemblyVersion导入网页时出现问题

我在_Layout.cshtml文件的页脚中使用以下代码将AssemblyInfo版本数据放入我的MVC3站点中每个页面的页脚.然而:

@System.Reflection.Assembly.GetExecutingAssembly().GetName().Version.ToString()
Run Code Online (Sandbox Code Playgroud)

只需在页脚中打印:

Revision 0.0.0.0
Run Code Online (Sandbox Code Playgroud)

当我修改视图以使用以下内容显示"执行装配"的所有装配信息时

@System.Reflection.Assembly.GetExecutingAssembly().GetName().ToString()
Run Code Online (Sandbox Code Playgroud)

其中打印以下内容:

Revision App_Web__layout.cshtml.639c3968.hlogy75x, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null
Run Code Online (Sandbox Code Playgroud)

这表明"执行程序集"不是我的主要应用程序,它是视图本身.

如何获取ACTUAL应用程序的程序集信息,而不仅仅是单个视图?

c# reflection assemblies razor asp.net-mvc-3

100
推荐指数
4
解决办法
4万
查看次数

将整数转换为长整数

我需要使用反射来获取字段的值.碰巧我并不总是确定该字段的数据类型是什么.为此,为了避免一些代码重复,我创建了以下方法:

@SuppressWarnings("unchecked")
private static <T> T getValueByReflection(VarInfo var, Class<?> classUnderTest, Object runtimeInstance) throws Throwable {
  Field f = classUnderTest.getDeclaredField(processFieldName(var));
  f.setAccessible(true);
  T value = (T) f.get(runtimeInstance);

  return value;
}
Run Code Online (Sandbox Code Playgroud)

并使用此方法,如:

Long value1 = getValueByReflection(inv.var1(), classUnderTest, runtimeInstance);
Run Code Online (Sandbox Code Playgroud)

要么

Double[] value2 = getValueByReflection(inv.var2(), classUnderTest, runtimeInstance);
Run Code Online (Sandbox Code Playgroud)

问题是,我似乎无法施展IntegerLong:

java.lang.ClassCastException: java.lang.Integer cannot be cast to java.lang.Long
Run Code Online (Sandbox Code Playgroud)

有没有更好的方法来实现这一目标?

我使用的是Java 1.6.

java reflection casting

100
推荐指数
8
解决办法
34万
查看次数

创建后将属性添加到匿名类型

我使用匿名对象将我的Html属性传递给一些辅助方法.如果消费者没有添加ID属性,我想在我的帮助方法中添加它.

如何向此匿名对象添加属性?

c# reflection anonymous-objects

99
推荐指数
3
解决办法
4万
查看次数

从IEnumerable <T>获取类型T.

有没有一种方法来检索类型TIEnumerable<T>通过反射?

例如

我有一个可变IEnumerable<Child>信息; 我想通过反射检索Child的类型

c# generics reflection

98
推荐指数
5
解决办法
6万
查看次数

Java反射 - setAccessible的影响(true)

我正在使用一些注释来动态设置类中的字段值.因为无论是public,protected还是private,我想这样做,setAccessible(true)每次调用set()方法之前,我都调用Field对象.我的问题是这个setAccessible()电话会对电影本身产生什么样的影响?

更具体地说,它是一个私有字段和这组代码调用setAccessible(true).如果代码中的其他位置然后通过反射检索相同的字段,那么该字段是否已经可访问?或者getDeclaredFields(),getDeclaredField()方法每次都返回Field对象的新实例吗?

我想另一种陈述问题的方法是,如果我打电话setAccessible(true),在我完成之后将它设置回原始值有多重要?

java reflection

98
推荐指数
3
解决办法
6万
查看次数

如何将setAccessible限制为仅仅"合法"使用?

我越了解它的力量java.lang.reflect.AccessibleObject.setAccessible,我就越能对它做什么感到惊讶.这是根据我对问题的回答改编的(使用反射来更改静态最终File.separatorChar以进行单元测试).

import java.lang.reflect.*;

public class EverythingIsTrue {
   static void setFinalStatic(Field field, Object newValue) throws Exception {
      field.setAccessible(true);

      Field modifiersField = Field.class.getDeclaredField("modifiers");
      modifiersField.setAccessible(true);
      modifiersField.setInt(field, field.getModifiers() & ~Modifier.FINAL);

      field.set(null, newValue);
   }
   public static void main(String args[]) throws Exception {      
      setFinalStatic(Boolean.class.getField("FALSE"), true);

      System.out.format("Everything is %s", false); // "Everything is true"
   }
}
Run Code Online (Sandbox Code Playgroud)

你可以做真正令人发指的事情:

public class UltimateAnswerToEverything {
   static Integer[] ultimateAnswer() {
      Integer[] ret = new Integer[256];
      java.util.Arrays.fill(ret, 42);
      return ret;
   }   
   public static void main(String args[]) throws Exception { …
Run Code Online (Sandbox Code Playgroud)

java security reflection

97
推荐指数
3
解决办法
2万
查看次数

如何检查类型是否提供无参数构造函数?

我想检查运行时已知的类型是否提供无参数构造函数.这Type堂课并没有带来任何好处,所以我假设我必须使用反思?

.net c# reflection constructor types

97
推荐指数
4
解决办法
3万
查看次数

Java中的a.getClass()和A.class有什么区别?

在Java中,使用a.getClass()或选择的优缺点是什么A.class?要么可以在任何Class<?>预期的地方使用,但我想在不同的情况下使用它们会有性能或其他微妙的好处(就像有Class.forName()ClassLoader.loadClass().

java reflection class

97
推荐指数
4
解决办法
4万
查看次数

在Java中避免使用instanceof

具有一系列"instanceof"操作被认为是"代码味道".标准答案是"使用多态".在这种情况下我该怎么做?

基类有许多子类; 没有一个在我的控制之下.类似的情况是Java类Integer,Double,BigDecimal等.

if (obj instanceof Integer) {NumberStuff.handle((Integer)obj);}
else if (obj instanceof BigDecimal) {BigDecimalStuff.handle((BigDecimal)obj);}
else if (obj instanceof Double) {DoubleStuff.handle((Double)obj);}
Run Code Online (Sandbox Code Playgroud)

我确实可以控制NumberStuff等等.

我不想在几行代码中使用多行代码.(有时我将一个HashMap映射到一个IntegerStuff的实例,将BigDecimal.class映射到一个BigDecimalStuff的实例等等.但是今天我想要一些更简单的东西.)

我想要像这样简单的东西:

public static handle(Integer num) { ... }
public static handle(BigDecimal num) { ... }
Run Code Online (Sandbox Code Playgroud)

但是Java不会那样工作.

我想在格式化时使用静态方法.我正在格式化的东西是复合的,其中Thing1可以包含一个数组Thing2s和Thing2可以包含一个Thing1s数组.当我实现这样的格式化程序时,我遇到了问题:

class Thing1Formatter {
  private static Thing2Formatter thing2Formatter = new Thing2Formatter();
  public format(Thing thing) {
      thing2Formatter.format(thing.innerThing2);
  }
}
class Thing2Formatter {
  private static Thing1Formatter thing1Formatter = new Thing1Formatter();
  public format(Thing2 thing) {
      thing1Formatter.format(thing.innerThing1);
  }
}
Run Code Online (Sandbox Code Playgroud)

是的,我知道HashMap和更多代码也可以修复它.但相比之下,"instanceof"似乎更具可读性和可维护性.有什么简单但不臭吗?

注释已添加5/10/2010:

事实证明,将来可能会添加新的子类,而我现有的代码必须优雅地处理它们.在这种情况下,类上的HashMap不起作用,因为找不到类.一系列if语句,从最具体的开始到以最一般的结尾,可能是最好的:

if (obj instanceof SubClass1) …
Run Code Online (Sandbox Code Playgroud)

java reflection polymorphism instanceof chain-of-responsibility

96
推荐指数
7
解决办法
7万
查看次数

确定代码是否作为单元测试的一部分运行

我有一个单元测试(nUnit).调用堆栈中的许多层如果通过单元测试运行,则方法将失败.

理想情况下,你会使用像mocking这样的东西来设置这个方法所依赖的对象,但这是第三方代码,如果没有大量工作我就不能这样做.

我不想设置nUnit特定的方法 - 这里有太多的级别,并且它是一个很差的单元测试方法.

相反,我想要做的是在调用堆栈中添加类似这样的东西

#IF DEBUG // Unit tests only included in debug build
if (IsRunningInUnitTest)
   {
   // Do some setup to avoid error
   }
#endif
Run Code Online (Sandbox Code Playgroud)

那么关于如何编写IsRunningInUnitTest的任何想法?

PS我完全清楚这不是很好的设计,但我认为它比替代品更好.

c# reflection nunit

96
推荐指数
9
解决办法
4万
查看次数