我在_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应用程序的程序集信息,而不仅仅是单个视图?
我需要使用反射来获取字段的值.碰巧我并不总是确定该字段的数据类型是什么.为此,为了避免一些代码重复,我创建了以下方法:
@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)
问题是,我似乎无法施展Integer到Long:
java.lang.ClassCastException: java.lang.Integer cannot be cast to java.lang.Long
Run Code Online (Sandbox Code Playgroud)
有没有更好的方法来实现这一目标?
我使用的是Java 1.6.
我使用匿名对象将我的Html属性传递给一些辅助方法.如果消费者没有添加ID属性,我想在我的帮助方法中添加它.
如何向此匿名对象添加属性?
有没有一种方法来检索类型T从IEnumerable<T>通过反射?
例如
我有一个可变IEnumerable<Child>信息; 我想通过反射检索Child的类型
我正在使用一些注释来动态设置类中的字段值.因为无论是public,protected还是private,我想这样做,setAccessible(true)每次调用set()方法之前,我都调用Field对象.我的问题是这个setAccessible()电话会对电影本身产生什么样的影响?
更具体地说,它是一个私有字段和这组代码调用setAccessible(true).如果代码中的其他位置然后通过反射检索相同的字段,那么该字段是否已经可访问?或者getDeclaredFields(),getDeclaredField()方法每次都返回Field对象的新实例吗?
我想另一种陈述问题的方法是,如果我打电话setAccessible(true),在我完成之后将它设置回原始值有多重要?
我越了解它的力量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) 我想检查运行时已知的类型是否提供无参数构造函数.这Type堂课并没有带来任何好处,所以我假设我必须使用反思?
在Java中,使用a.getClass()或选择的优缺点是什么A.class?要么可以在任何Class<?>预期的地方使用,但我想在不同的情况下使用它们会有性能或其他微妙的好处(就像有Class.forName()和ClassLoader.loadClass().
具有一系列"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
我有一个单元测试(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我完全清楚这不是很好的设计,但我认为它比替代品更好.
reflection ×10
c# ×5
java ×5
.net ×1
assemblies ×1
casting ×1
class ×1
constructor ×1
generics ×1
instanceof ×1
nunit ×1
polymorphism ×1
razor ×1
security ×1
types ×1