我想知道是否可以以编程方式将堆栈跟踪递归到特定程序集。
我正在使用StructureMap它,它创建一个特定类的实例,以注入另一个类。kewl。当我在注入类的构造函数中时,我希望查看父类是什么,并且堆栈跟踪或多或少有一些被调用的结构图方法。
因此,我希望通过递归堆栈跟踪GetCurrentMethod()方法直到我们没有结构图类来找到调用此结构图注入的方法。
就像是...
var callingMethod = System.Reflection.MethodBase.GetCurrentMethod();
while (callingMethod.DeclaringType.ToString().Contains("structuremap"))
{
// get parent calling method, from the variable 'callingMethod'.
}
// here means we've recursed high enough or we have no more to go (null??).
Run Code Online (Sandbox Code Playgroud)
有人可以帮忙吗?
这个问题与这个SO 问题密切相关......我最终根据这里的答案添加了自己的答案:)
我有一个存储过程返回一个选择,如下所示:
select name , family , sex from person
Run Code Online (Sandbox Code Playgroud)
我有一个类将这样的人命名为:
public class person {
string name {get;set;}
string family {get;set;}
GenderEnum sex {get;set;}
}
Run Code Online (Sandbox Code Playgroud)
我有一个名为 GenderEnum 的枚举,如下所示:
Enum GenderEnum
{
Man = 1 ,
Woman = 2 ,
}
Run Code Online (Sandbox Code Playgroud)
我想将我的数据表转换为 Person 的 IList 。
我的问题是:当我想将性别列转换为性别字段时,我大多数将类型 int 转换为 GenderEnum。
不要忘记,我最有一种通用方法可以将所有 DataTable 转换为所有类,并且此方法最能识别每个属性都具有枚举类型。
此方法根据名称将所有列映射到所有属性
我写了这个方法,但这不适用于所有类型。
例如:如果我的列是 int 并且我的属性是 strinbe 并且具有相同的名称,则映射不起作用。
public List<T> ConvertTo<T>(DataTable datatable) where T : new()
{
var temp = new List<T>();
try
{
var columnsNames = (from DataColumn dataColumn …Run Code Online (Sandbox Code Playgroud) 如何根据下面的代码使用反射实例化数组属性?
public class Foo
{
public Foo()
{
foreach(var property in GetType().GetProperties())
{
if (property.PropertyType.IsArray)
{
// the line below creates a 2D array of type Bar. How to fix?
var array = Array.CreateInstance(property.PropertyType, 0);
property.SetValue(this, array, null);
}
}
}
public Bar[] Bars {get;set;}
}
public class Bar
{
public string Name {get;set;}
}
Run Code Online (Sandbox Code Playgroud) 我需要调用一个方法,传递一个 int。使用以下代码我可以获取该方法但不传递参数。如何修复它?
dynamic obj;
obj = Activator.CreateInstance(Type.GetType(String.Format("{0}.{1}", namespaceName, className)));
var method = this.obj.GetType().GetMethod(this.methodName, new Type[] { typeof(int) });
bool isValidated = method.Invoke(this.obj, new object[1]);
public void myMethod(int id)
{
}
Run Code Online (Sandbox Code Playgroud) 我知道我可以使用以下方法检查列表
Collection.class.isAssignableFrom(field.getType())
Run Code Online (Sandbox Code Playgroud)
但是如何检查类中的 Field 是否是 Map 的实现呢?
void myMethod(Class<?> classToCheck) {
Field[] fields = classToCheck.getDeclaredFields();
for(Field field:fields) {
// check if field implements Map<?,?>
}
}
Run Code Online (Sandbox Code Playgroud) 朋友们,
鉴于这三个类:
public class MyBaseClass {
}
public class MyDerivedClass1: MyBaseClass {
}
public class MyDerivedClass2: MyBaseClass {
}
Run Code Online (Sandbox Code Playgroud)
在运行时,我将有一个类型的对象MyBaseClass(要么是MyDerivedClass2要么MyDerivedClass1)。我如何在运行时确定 ifMyBaseClass是MyDerivedClass1?
我有如下代码片段的列表:
List<String> nameList = new ArrayList<>();
nameList.add("Robert");
nameList.add("Tom");
nameList.add("Curran");
//robert, tom, curran
Run Code Online (Sandbox Code Playgroud)
现在我想使用 Java 中的反射 API 修改这些列表值。如果我们打印列表,输出如下所示:
//xxx,xxx,xxx
在研究这两个关键字时,有一部分让我感到困惑。
jit 编译器动态地解释或编译指令,即逐行。
我了解到反射对于动态运行是必要的,因为 Java 是一种静态语言。
我不知道两者之间的功能差异。jit 编译器是动态解释编译的,但是这不是动态查找类类型等信息的行为吗?
我知道我可以int[]通过使用获得 的类class.forName("[I"),但是我怎样才能获得 的类int[][][]呢?
我知道反射是一种在不知道具体类型的情况下调用方法或操作字节码的技术。
最近在研究类加载器的时候,看到一篇文章,说反射是让类加载器动态加载类,做类型检查。这是真的?
原文不是英文,所以翻译可能有点奇怪。
Java 动态加载类。也就是说,所有代码都在运行时链接到 JVM。每个类都动态链接到 JVM 并在引用该类时加载到内存中。Java 的运行时库(【JDK 安装目录】/jre/lib/rt.jar)也不例外。这种动态的类加载是通过Java的类加载器系统完成的,Java提供的类加载器通过java.lang.ClassLoader来表示。当 JVM 启动时,它会创建一个引导类加载器,然后将第一个类 Object 读入系统。
在运行时动态加载一个类意味着 JVM 没有关于该类的信息。换句话说,JVM 不知道有关方法、字段和类的继承关系的信息。因此,类加载器应该能够在加载类时获取必要的信息并检查类是否正确。如果您不能这样做,则 JVM 可能具有不匹配的 .class 文件版本,并且将无法进行类型检查。JVM 具有内部分析类的能力,从 JDK 1.1 开始,开发人员可以通过反射来分析这些类。
reflection ×10
java ×5
c# ×4
.net ×2
arrays ×2
jvm ×2
inheritance ×1
object ×1
recursion ×1
runtime ×1