我来自低级语言--C++是我编程的最高级别.
最近我遇到了Reflection,我无法理解如何在没有代码味道的情况下使用它.
在我看来,在运行期间检查类/方法/函数的想法指出了设计中的一个缺陷 - 我认为反射(试图)解决的大多数问题可以与多态性或正确使用继承一起使用.
我错了吗?我是否误解了反思的概念和效用?
我正在寻找一个很好的解释,说明何时使用Reflection,其他解决方案将失败或实现过于繁琐以及何时不使用它.
请指教这个低级别的笨蛋.
我有以下方法将对象序列化为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)
有人可以告诉我如何实现这一目标吗?
谢谢
这是一个愚蠢的问题,但是有可能从该方法中获取当前正在执行的方法的名称吗?
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)
谢谢
这是班级:
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代码中定义的内部类:
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)
我错过了什么?
这很好用:
var expectedType = typeof(string);
object value = "...";
if (value.GetType().IsAssignableFrom(expectedType))
{
...
}
Run Code Online (Sandbox Code Playgroud)
但我怎么检查是否值是不设置一个字符串数组expectedType来typeof(string[])?我想做的事情如下:
var expectedType = typeof(string);
object value = new[] {"...", "---"};
if (value.GetType().IsArrayOf(expectedType)) // <---
{
...
}
Run Code Online (Sandbox Code Playgroud)
这可能吗?
我偶然发现了这段代码:
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类的字段应该需要高级黑客并且要困难得多.
然而,这段代码编译和工作.有人可以解释我的推理有什么问题吗?
在Go中,如何在运行时从其类型创建对象的实例?我想你也需要先得到type对象的实际值?
我试图做懒惰的实例化以节省内存.
我正在尝试创建一个Java工具,它将扫描Java应用程序的结构并提供一些有意义的信息.为此,我需要能够从项目位置(JAR/WAR或只是一个文件夹)扫描所有.class文件,并使用反射来阅读他们的方法.事实证明这几乎是不可能的.
我可以找到许多基于URLClassloader的解决方案,它允许我从目录/存档加载特定的类,但是没有一个允许我加载类而没有关于类名或包结构的任何信息.
编辑:我想我的说法很差.我的问题不是我无法获得所有的类文件,我可以通过递归等来做到这一点并正确定位它们.我的问题是为每个类文件获取一个Class对象.
我想写一个方法,返回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)
提前致谢!