标签: reflection

反射如何不会导致代码味道?

我来自低级语言--C++是我编程的最高级别.

最近我遇到了Reflection,我无法理解如何在没有代码味道的情况下使用它.

在我看来,在运行期间检查类/方法/函数的想法指出了设计中的一个缺陷 - 我认为反射(试图)解决的大多数问题可以与多态性或正确使用继承一起使用.

我错了吗?我是否误解了反思的概念和效用?

我正在寻找一个很好的解释,说明何时使用Reflection,其他解决方案将失败或实现过于繁琐以及何时不使用它.

请指教这个低级别的笨蛋.

reflection

63
推荐指数
5
解决办法
3776
查看次数

如何测试类型是否是匿名的?

我有以下方法将对象序列化为HTML标记.如果类型不是Anonymous,我只想这样做.

private void MergeTypeDataToTag(object typeData)
{
    if (typeData != null)
    {
        Type elementType = typeData.GetType();

        if (/* elementType != AnonymousType */)
        {
            _tag.Attributes.Add("class", elementType.Name);    
        }

        // do some more stuff
    }
}
Run Code Online (Sandbox Code Playgroud)

有人可以告诉我如何实现这一目标吗?

谢谢

c# reflection anonymous-types

63
推荐指数
5
解决办法
2万
查看次数

获取当前方法的名称

这是一个愚蠢的问题,但是有可能从该方法中获取当前正在执行的方法的名称吗?

Public Sub SomeMethod()

   Dim methodName as String = System.Reflection.[function to get the current method name here?]

End Sub
Run Code Online (Sandbox Code Playgroud)

谢谢

.net vb.net reflection

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

如何将getMethod()与原始类型一起使用?

这是班级:

class Foo {
  public void bar(int a, Object b) {
  }
}
Run Code Online (Sandbox Code Playgroud)

现在我想从课堂上"反思"这个方法:

Class c = Foo.class;
Class[] types = { ... }; // what should be here?
Method m = c.getMethod("bar", types);
Run Code Online (Sandbox Code Playgroud)

java reflection

62
推荐指数
1
解决办法
2万
查看次数

如何在Java中用反射实例化内部类?

我尝试实例化以下Java代码中定义的内部类:

 public class Mother {
      public class Child {
          public void doStuff() {
              // ...
          }
      }
 }
Run Code Online (Sandbox Code Playgroud)

当我试图像这样得到一个Child的实例

 Class<?> clazz= Class.forName("com.mycompany.Mother$Child");
 Child c = clazz.newInstance();
Run Code Online (Sandbox Code Playgroud)

我得到这个例外:

 java.lang.InstantiationException: com.mycompany.Mother$Child
    at java.lang.Class.newInstance0(Class.java:340)
    at java.lang.Class.newInstance(Class.java:308)
    ...
Run Code Online (Sandbox Code Playgroud)

我错过了什么?

java reflection instantiationexception

62
推荐指数
1
解决办法
3万
查看次数

如何检查对象是否是某种类型的数组?

这很好用:

var expectedType = typeof(string);
object value = "...";
if (value.GetType().IsAssignableFrom(expectedType))
{
     ...
}
Run Code Online (Sandbox Code Playgroud)

但我怎么检查是否值是不设置一个字符串数组expectedTypetypeof(string[])?我想做的事情如下:

var expectedType = typeof(string);
object value = new[] {"...", "---"};
if (value.GetType().IsArrayOf(expectedType)) // <---
{
     ...
}
Run Code Online (Sandbox Code Playgroud)

这可能吗?

.net c# arrays reflection types

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

要求Reflection API覆盖System.String.Empty的含义是什么?

我偶然发现了这段代码:

static void Main()
{
    typeof(string).GetField("Empty").SetValue(null, "evil");//from DailyWTF

    Console.WriteLine(String.Empty);//check

    //how does it behave?
    if ("evil" == String.Empty) Console.WriteLine("equal"); 

    //output: 
    //evil 
    //equal

 }
Run Code Online (Sandbox Code Playgroud)

我想知道如何编译这段代码甚至是可能的.我的理由是:

根据MSDN String.Empty是只读的,因此更改它应该是不可能的,并且编译应以"无法分配静态只读字段"或类似错误结束.

我认为Base Class Library程序集以某种方式受到保护和签名,以及什么可以防止这种攻击.下次有人可能会更改System.Security.Cryptography或其他关键类.

我认为基类库程序集是在安装.NET之后由NGEN编译的,因此更改String类的字段应该需要高级黑客并且要困难得多.

然而,这段代码编译和工作.有人可以解释我的推理有什么问题吗?

.net c# reflection

61
推荐指数
4
解决办法
2900
查看次数

如何在Go中运行时从其类型创建结构的新实例?

在Go中,如何在运行时从其类型创建对象的实例?我想你也需要先得到type对象的实际值?

我试图做懒惰的实例化以节省内存.

reflection go go-reflect

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

如何在运行时从文件夹或JAR加载类?

我正在尝试创建一个Java工具,它将扫描Java应用程序的结构并提供一些有意义的信息.为此,我需要能够从项目位置(JAR/WAR或只是一个文件夹)扫描所有.class文件,并使用反射来阅读他们的方法.事实证明这几乎是不可能的.

我可以找到许多基于URLClassloader的解决方案,它允许我从目录/存档加载特定的类,但是没有一个允许我加载类而没有关于类名或包结构的任何信息.

编辑:我想我的说法很差.我的问题不是我无法获得所有的类文件,我可以通过递归等来做到这一点并正确定位它们.我的问题是为每个类文件获取一个Class对象.

java reflection load jar class

61
推荐指数
3
解决办法
9万
查看次数

如何让Java方法返回任何类型的通用列表?

我想写一个方法,返回java.util.List任何类型的方法,而不需要输入任何东西:

List<User> users = magicalListGetter(User.class);

List<Vehicle> vehicles = magicalListGetter(Vehicle.class);

List<String> strings = magicalListGetter(String.class);
Run Code Online (Sandbox Code Playgroud)

方法签名会是什么样的?像这样的东西,或许(?):

public List<<?> ?> magicalListGetter(Class<?> clazz) {
    List<?> list = doMagicalVooDooHere();

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

提前致谢!

java generics reflection casting list

61
推荐指数
3
解决办法
14万
查看次数