我需要使用反射调用委托方法,并将方法名称作为字符串传递。
例如,我将传递类名和委托的My.Controls.TestDelegate.myConverterAction位置:TestDelegatemyConverterAction
namespace My.Controls
{
public static class TestDelegate
{
public static CustomConversionHandler myConverterAction = new CustomConversionHandler(doSomething);
private static ulong doSomething(object[] values)
{
return 2;
}
}
}
Run Code Online (Sandbox Code Playgroud)
GetMethod()我想以这种方式使用该方法:
int separator = actionDelegate.LastIndexOf('.');
string className = actionDelegate.Substring(0, separator);
string methodName = actionDelegate.Substring(separator + 1, actionDelegate.Length - className.Length - 1);
var t = Type.GetType(className); //This works
MethodInfo m = t.GetMethod(methodName, BindingFlags.Public | BindingFlags.Static); //This returns null...even with different BindingFlags options
Run Code Online (Sandbox Code Playgroud)
但我获得了一个空引用。我怎么解决这个问题?
给定以下课程:
class A<T> { ... }
class B1: A<int> { ... }
class B2: A<string> { ... }
class C: B1 { ... }
class D: B2 { ... }
Run Code Online (Sandbox Code Playgroud)
我们得到以下结果:
typeof(C).IsSubclassOf(typeof(A<>)) // returns false
typeof(C).IsSubclassOf(typeof(A<int>) // returns true
Run Code Online (Sandbox Code Playgroud)
现在的问题是,如果我们不知道 B 的泛型类型是什么怎么办?那么我们如何确定我们的类型是否是泛型基类 A<> 的后代呢?
bool IsDescebdedFromA(object x)
{
return typeof(x).IsSubclassOf(typeof(A<>)); // does not give correct result. we have to specify generic type.
}
Run Code Online (Sandbox Code Playgroud)
已经谢谢了
我正在使用 Scala 类型系统实现一些表达式。为了确定表达式的类型,if-then-else我需要能够实现以下函数
def leastUpperBound(thenPartType: Type, elsePartType: Type): Type
Run Code Online (Sandbox Code Playgroud)
是否有某个函数scala.reflect._可以执行评估?或者我是否必须使用这些提取器来实现搜索*TypeApi?
提前致谢
在 Java 8 之前,可以sun.misc.Unsafe通过如下方法获取单例实例:
public static Unsafe getUnsafe() {
try {
Field f = Unsafe.class.getDeclaredField("theUnsafe");
f.setAccessible(true);
return (Unsafe) f.get(null);
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
Run Code Online (Sandbox Code Playgroud)
尽管强烈建议不要使用Unsafe,但许多供应商和图书馆在内部使用它。
现在,有了 Java 9 和 Jigsaw,我认为Unsafe处理方式也发生了变化。我读了一些带有相反信息的帖子。有人说它已完全隐藏,甚至无法检索,有人说必须启用 VM 标志,而另一些人则写道它现在应该得到正式支持。
那么:是否仍然可以sun.misc.Unsafe在 Java 9 中使用?如果可以,如何使用?
我见过很多关于从基本类型获取所有类型等的问题,但这并不是我所需要的。例如,我有一个抽象基类:
public abstract class BasePart
{
//whatever
}
Run Code Online (Sandbox Code Playgroud)
我有很多从它派生的类。喜欢...
public class HorizontalPanel : BasePart { //code }
public class VerticalPanel : BasePart { //code }
public class RainBoard : BasePart { //code }
Run Code Online (Sandbox Code Playgroud)
等等。我总是按基类列出它们:
List<BasePart> parts;
Run Code Online (Sandbox Code Playgroud)
我使用类型转换和泛型来做我想做的事情。然而,我需要过滤这个列表,并且我只想要其中可用的类型信息。并且只有一次用于类型。例如,如果我的列表有三个 HorizontalPanels 和两个 VerticalPanels,我想要从中得到的是List<Type>仅包含{HorizontalPanel, VerticalPanel}. 我想我可以在链式循环中摆弄对象本身以获得我想要的东西,但我确信 C# 有更好的方法来做到这一点。任何人?
使用 bash,我认为这是可能的,但不确定 JavaScript,假设我们有这个:
const {masterid} = req.query;
if (!masterid) {
return res.status(500).send(new Error('Missing query param "masterid".'));
}
Run Code Online (Sandbox Code Playgroud)
我想要做的不是在字符串中硬编码“masterid”,而是执行如下操作:
const {masterid} = req.query;
if (!masterid) {
return res.status(500).send(new Error(`Missing query param "${Reflect(masterid).name()}.".`));
}
Run Code Online (Sandbox Code Playgroud)
有没有办法使用 Reflect API 来做到这一点?
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Reflect
我有这么一小段代码:
public static I CreateInstance<I>(string myClassName) where I : class
{
Debug.Log("Instance: " + (Activator.CreateInstance(null, myClassName) as I));
return Activator.CreateInstance(null, myClassName) as I;
}
void Test(string testName)
{
testName = "TestProvider";
var data = CreateInstance<IProviderInitializer>(testName).GetProviderInfo();
Debug.Log("Data: " + data);
}
Run Code Online (Sandbox Code Playgroud)
问题是我得到了 NULL Reference Exception,但我不知道为什么。
我正在扩展现有的 Java 类,它有一些私有方法。为了实现我想要的,我必须重写这个私有方法。
所以我读了一些关于 Java 反射的文章,并得出以下结论:
class CustomSlider : Slider() {
init {
Slider::class.java.getDeclaredMethod("drawTrack", Canvas::class.java, Int::class.java, Int::class.java).isAccessible = true
}
override fun drawTrack(canvas: Canvas, width: Int, top: Int) {
}
}
Run Code Online (Sandbox Code Playgroud)
但在线上override,我收到一条错误消息,表明这是不可能的。
那么我该怎么做呢?
const metadataKey = "metadataKey";
class User
{
@Reflect.metadata(metadataKey, 1)
name: string;
@Reflect.metadata(metadataKey, 2)
age: number;
}
getPropertyDecorators(User); // I hope it can return [1, 2]
Run Code Online (Sandbox Code Playgroud)
我希望函数 getPropertyDecorators 不需要创建 User 的实例。
我有一些遗留代码,如下所示:
Set<Class<? extends Foo>> classes = reflections.getSubTypesOf(Foo.class);
for (Class<? extends Foo> cl : classes) {
Foo<?, ?> foo = cl.newInstance();
// use foo
}
Run Code Online (Sandbox Code Playgroud)
我想添加另一个接口:
interface NewFoo extends Foo {...}
Run Code Online (Sandbox Code Playgroud)
但随后它尝试调用 NewFoo 上的 newInstance。目前我的解决方案是这样的:
try {
Foo<?, ?> foo = cl.newInstance();
// use foo
} catch (InstantiationException ignore) {
}
Run Code Online (Sandbox Code Playgroud)
但我想知道是否有更好的方法?当我手里有一个Class对象时,我能区分接口和类吗?
reflection ×10
c# ×4
java ×2
class ×1
delegates ×1
generics ×1
inheritance ×1
interface ×1
java-9 ×1
javascript ×1
kotlin ×1
native ×1
node.js ×1
scala ×1
types ×1
typescript ×1
unsafe ×1