javanet:如何在通用 class 上创建 NNull
javonet : how to create a NNull on generic class
我正在评估 javanet 从 java 调用 C# dll。正如我所见,它更符合我的上下文(jni4net 的一般失败,并且 JnBridge 不导出我的所有类型)
我想在复杂的泛型上调用具有空实例的方法。
System.Func<MyType<MySubType>, MyOtherType, MyAnotherType>
我尝试在没有泛型的情况下调用,但 javonet 找不到该方法。
new NNull("System.Func")
我尝试使用 return 调用,但 javanet 再次找不到该方法。
new NNull("System.Func`3[MyType`1[MySubType],MyOtherType,MyAnotherType]")
我找不到调用 NNull 的通用方法?有吗?
提前感谢您的帮助;o)
如果只有一种方法具有匹配数量的参数(无重载),那么您可以轻松通过 "null"。
然而,由于 Javonet invoke(String, Object...) 方法需要方法名称和任意数量的参数,如果您想传递单个参数 null,则必须调用 obj.invoke("MethodName", new Object[] {无效的});所以 Java 知道您传递的是单个参数 null 而不是 null 数组,这意味着根本没有参数。
在 .NET 方面的情况:
public class ObjA
{
public void MethodA(Func<MyType<MySubType>, MyOtherType, MyAnotherType> arg)
{
Console.WriteLine("Called MethodA");
}
}
public class MyType<T>
{
}
public class MySubType
{
}
public class MyOtherType
{
}
public class MyAnotherType
{
}
并使用 Javonet 从 Java 调用它,您只需:
NObject objA = Javonet.New("ObjA");
objA.invoke("MethodA",new Object[] {null});
仅当 .NET 无法从传递的 null 中推导出应调用哪个方法时,只有在存在另一个具有匹配参数数量的方法时才需要 NNull type。例如:
public void MethodA(Func<String> arg1);
public void MethodA(Func<int> arg1);
有多个重载
另一方面,如果您有多个具有相同数量参数的方法重载并且想要传递 null 而不是像在纯 .NET 中一样的复杂参数,您必须将 null 转换为预期类型:
public class ObjA
{
public void MethodA(Func<MyType<MySubType>, MyOtherType, MyAnotherType> arg, int arg2)
{
Console.WriteLine("Called MethodA with args: Func<MyType<MySubType>, MyOtherType, MyAnotherType> arg, int arg2");
}
public void MethodA(Func<MyOtherType> arg, int arg2)
{
Console.WriteLine("Called MethodA with args: Func<MyOtherType> arg, int arg2");
}
}
在 .NET 中,您将调用:
MethodA((Func<MyType<MySubType>, MyOtherType, MyAnotherType>)null, 0);
您仍然可以在 Java 中使用此处提供的 Javonet 1.4hf26-SNAPSHOT 版本完成相同的操作:
http://download.javonet.com/1.4/javonet-1.4hf26-SNAPSHOT.jar
虽然不是正式版,但是很稳定,可以使用。该补丁包括将 NType 作为参数传递给 NNull 对象的可能性。在这种情况下,您将能够使用 Javonet 泛型类型创建语法构造复杂的泛型类型,如下例所示:
NType myAnotherType = Javonet.getType("MyAnotherType");
NType myOtherType = Javonet.getType("MyOtherType");
NType mySubType = Javonet.getType("MySubType");
NType myType = Javonet.getType("MyType`1",mySubType);
NType func = Javonet.getType("Func`3",myType,myOtherType,myAnotherType);
NObject objA = Javonet.New("ObjA");
objA.invoke("MethodA",new NNull(func),0);
我正在评估 javanet 从 java 调用 C# dll。正如我所见,它更符合我的上下文(jni4net 的一般失败,并且 JnBridge 不导出我的所有类型)
我想在复杂的泛型上调用具有空实例的方法。
System.Func<MyType<MySubType>, MyOtherType, MyAnotherType>
我尝试在没有泛型的情况下调用,但 javonet 找不到该方法。
new NNull("System.Func")
我尝试使用 return 调用,但 javanet 再次找不到该方法。
new NNull("System.Func`3[MyType`1[MySubType],MyOtherType,MyAnotherType]")
我找不到调用 NNull 的通用方法?有吗?
提前感谢您的帮助;o)
如果只有一种方法具有匹配数量的参数(无重载),那么您可以轻松通过 "null"。
然而,由于 Javonet invoke(String, Object...) 方法需要方法名称和任意数量的参数,如果您想传递单个参数 null,则必须调用 obj.invoke("MethodName", new Object[] {无效的});所以 Java 知道您传递的是单个参数 null 而不是 null 数组,这意味着根本没有参数。
在 .NET 方面的情况:
public class ObjA
{
public void MethodA(Func<MyType<MySubType>, MyOtherType, MyAnotherType> arg)
{
Console.WriteLine("Called MethodA");
}
}
public class MyType<T>
{
}
public class MySubType
{
}
public class MyOtherType
{
}
public class MyAnotherType
{
}
并使用 Javonet 从 Java 调用它,您只需:
NObject objA = Javonet.New("ObjA");
objA.invoke("MethodA",new Object[] {null});
仅当 .NET 无法从传递的 null 中推导出应调用哪个方法时,只有在存在另一个具有匹配参数数量的方法时才需要 NNull type。例如:
public void MethodA(Func<String> arg1);
public void MethodA(Func<int> arg1);
有多个重载
另一方面,如果您有多个具有相同数量参数的方法重载并且想要传递 null 而不是像在纯 .NET 中一样的复杂参数,您必须将 null 转换为预期类型:
public class ObjA
{
public void MethodA(Func<MyType<MySubType>, MyOtherType, MyAnotherType> arg, int arg2)
{
Console.WriteLine("Called MethodA with args: Func<MyType<MySubType>, MyOtherType, MyAnotherType> arg, int arg2");
}
public void MethodA(Func<MyOtherType> arg, int arg2)
{
Console.WriteLine("Called MethodA with args: Func<MyOtherType> arg, int arg2");
}
}
在 .NET 中,您将调用:
MethodA((Func<MyType<MySubType>, MyOtherType, MyAnotherType>)null, 0);
您仍然可以在 Java 中使用此处提供的 Javonet 1.4hf26-SNAPSHOT 版本完成相同的操作: http://download.javonet.com/1.4/javonet-1.4hf26-SNAPSHOT.jar
虽然不是正式版,但是很稳定,可以使用。该补丁包括将 NType 作为参数传递给 NNull 对象的可能性。在这种情况下,您将能够使用 Javonet 泛型类型创建语法构造复杂的泛型类型,如下例所示:
NType myAnotherType = Javonet.getType("MyAnotherType");
NType myOtherType = Javonet.getType("MyOtherType");
NType mySubType = Javonet.getType("MySubType");
NType myType = Javonet.getType("MyType`1",mySubType);
NType func = Javonet.getType("Func`3",myType,myOtherType,myAnotherType);
NObject objA = Javonet.New("ObjA");
objA.invoke("MethodA",new NNull(func),0);