所以我有一个定义了 2 个公共方法的类。当我调用 getDeclaredMethods 时,然后循环结果,打印名称,两者都正确显示。所以不仅该方法存在,而且反射调用也找到了它。
但是,当我尝试调用该方法(如下面的代码所示)时,我收到 NoSuchMethodException。那为什么调用的时候找不到呢?
public class Foo
{
public byte[] read_status(Object arg)
{
byte[] test = new byte[10];
for(int i = 0; i < 10; i++)
{
test[i] = (byte)i;
}
return test;
}
public int test(String s) throws Exception
{
Object r = this.getClass().getDeclaredMethod("read_status").invoke(this, (Object)s);
byte[] bytes = (bytes[])r;
for(int i = 0; i < bytes.length; i++)
{
System.out.println(""+bytes[i]);
}
return 0;
}
}
Run Code Online (Sandbox Code Playgroud) 各州的文件Mirror.Child,
当标签组件不为零时,它可能表示存储属性或活动枚举案例的名称。如果将字符串传递给descendant( : :) 方法,则使用标签进行查找。
什么时候Mirror.Child label值为零?
我想检查给定的f interface{}函数参数是否是指向结构的指针,但不知何故陷入困境:
更新的片段:
package main
import (
"fmt"
"log"
"reflect"
)
func main() {
// Switch f between being a pointer or not
f := &struct{Foo string}{"Bar"}
if err := something(f); err != nil {
log.Fatal(err.Error())
}
}
func something(f interface{}) error {
if reflect.ValueOf(f).Kind() != reflect.Struct {
return fmt.Errorf("not struct; is %s", reflect.ValueOf(f).Kind().String())
}
if reflect.ValueOf(f).Kind() != reflect.Ptr {
return fmt.Errorf("not ptr; is %s", reflect.ValueOf(f).Kind().String())
}
// Deal with element values...
t := reflect.ValueOf(f).Elem()
for i := …Run Code Online (Sandbox Code Playgroud) 我想创建以下类:
public class MultiDataOrTrigger : DataTrigger
{
public MultiDataOrTrigger()
{
}
// evaluate the current state of the trigger
internal override bool GetCurrentState(DependencyObject container, UncommonField<HybridDictionary[]> dataField)
{
bool retVal = false;
for (int i = 0; !retVal && i < TriggerConditions.Length; i++)
{
retVal = TriggerConditions[i].ConvertAndMatch(StyleHelper.GetDataTriggerValue(dataField, container, TriggerConditions[i].Binding));
}
return retVal;
}
}
Run Code Online (Sandbox Code Playgroud)
如何调用内部方法,创建内部类型的实例 - 我或多或少弄清楚了。为此,使用反射对我来说就足够了。
但我仍然无法通过重写另一个程序集中指定的虚拟内部方法来弄清楚自己。
回应评论:
我知道这个问题可以在没有这样的课程的情况下解决 - 我知道还有许多其他解决方案或解决方法。我自己在实践中使用了其中的许多内容。由于我不知道如何解决这个问题,我现在还没有停止任何开发。
我本质上是在问与这个老问题相同的问题,但针对的是 Java 14 而不是 Java 8。为了避免回答者导航到老问题的麻烦,我将在这里重新表述。我想从引用的方法中获取函数的名称。下面的 Java 代码应该能让您明白:
public class Main
{
public static void main(String[] args)
{
printMethodName(Main::main);
}
private static void printMethodName(Consumer<String[]> theFunc)
{
String funcName = // somehow get name from theFunc
System.out.println(funcName)
}
}
Run Code Online (Sandbox Code Playgroud)
C# 中的等效内容是:
public class Main
{
public static void Main()
{
var method = Main.Main;
PrintMethodName(method)
}
private static void PrintMethodName(Action action)
{
Console.WriteLine(action.GetMethodInfo().Name);
}
}
Run Code Online (Sandbox Code Playgroud)
根据老问题的公认答案,如果没有大量的工作,这在 Java 8 中是不可能的,例如这个解决方案。Java 14中有更优雅的解决方案吗?
我正在寻找一种方法来获取记录构造函数“字段”上定义的属性。
// See https://aka.ms/new-console-template for more information
using System.ComponentModel.DataAnnotations;
var property = typeof(TestRecord)
.GetProperties()
.First( x => x.Name == nameof(TestRecord.FirstName) );
var attr0 = property.Attributes; // NONE
var attr1 = property.GetCustomAttributes( typeof(DisplayAttribute), true ); // empty
var property1 = typeof(TestRecord)
.GetProperties()
.First( x => x.Name == nameof(TestRecord.LastName) );
var attr2 = property1.Attributes; // NONE
var attr3 = property1.GetCustomAttributes( typeof(DisplayAttribute), true ); // Works
public sealed record TestRecord( [Display] String FirstName, [property: Display] String LastName );
Run Code Online (Sandbox Code Playgroud)
我能够获取针对LastName该属性的属性(使用property:)。 …
我有一个对象集合,每个对象都有一个属性 EventData,它有许多不同的类型。这些类型都继承自IEventData接口。
例如:
{ _id: '...', EventData: { _t: 'TypeA', ... } }
{ _id: '...', EventData: { _t: 'TypeB', ... } }
Run Code Online (Sandbox Code Playgroud)
我当前在尝试注册类映射时遇到 MongoDB C# 驱动程序的问题。当使用通用版本注册类映射时,EventData 对象使用所有属性和类型鉴别器正确序列化:
BsonClassMap.RegisterClassMap<TypeA>();
// Full event data is written to collection
// { _id: '...', EventData: { _t: 'TypeA', InterfaceProperty: '...', ClassProperty: '...' } }
Run Code Online (Sandbox Code Playgroud)
这工作正常,但是我有大量不同的事件类型,并且想要尝试使用一些反射来帮助自动化此操作。当尝试使用 RegisterClassMap 的非通用版本,同时迭代实现 IEventData 接口的所有类型时,只有接口成员被序列化:
var types = AppDomain.CurrentDomain.GetAssemblies()
.SelectMany(i => i.GetTypes())
.Where(t => typeof(IEventData).IsAssignableFrom(t));
foreach (var type in types)
{
// If it's an interface, skip …Run Code Online (Sandbox Code Playgroud) 我希望能够解析字符串"x => x + 1",并能够实际将其用作 lambda 函数,如下所示:
val string = "x => x + 1"
val lambda = parseLambda(string)
val numbers = List(1, 2, 3)
val result = numbers.map(lambda) // Should be [2, 3, 4]
Run Code Online (Sandbox Code Playgroud)
我对该函数有以下实现parseLambda:
def parseLambda(string: String): Any => Any = {
val toolbox = runtimeMirror(getClass.getClassLoader).mkToolBox()
val tree = toolbox.parse(string)
val lambdaFunction = toolbox.compile(tree)().asInstanceOf[Any => Any]
lambdaFunction
}
Run Code Online (Sandbox Code Playgroud)
它适用于像"(x: Int) => x * 2"or这样的字符串"(s: String) => s.split(" ")",但如果我省略类型,例如"x => …
我有一个 java.lang.reflect.Method 方法,我想检查它是否用 @Override 注释标记。
尝试使用 method.isAnnotationPresent(Override.class) 执行此操作,但此方法不适用于此注释。还尝试了 MergedAnnotations.from(method).isPresent() 但它也不会为我的带有 @Override 的方法返回 true 。
可以检查一下吗?
我正在尝试使用 实例化一个对象Constructor.newInstance。构造函数需要一个类型为 的参数DoubleSupplier。如果我首先创建一个DoubleSupplier对象,然后将该对象传递给该newInstance方法,则这是成功的:
DoubleSupplier supplier = () -> 3.0;
obj = ctor.newInstance( supplier );
Run Code Online (Sandbox Code Playgroud)
但如果我尝试直接在调用中使用 lambda newInstance:
obj = ctor.newInstance( () -> 3.0 );
Run Code Online (Sandbox Code Playgroud)
它无法编译,并显示“此表达式的目标类型必须是函数式接口”。这两种方法有什么区别?
顺便说一句,我可以在使用 实例化对象时使用 lambda new。
obj2 = new SubTypeA( () -> 3.0 );
Run Code Online (Sandbox Code Playgroud)
示例程序如下。
public class CtorDemo
{
public static void main(String[] args)
{
SuperType obj = getSubType( SubTypeA.class );
System.out.println( obj.getClass().getName() );
}
private static SuperType
getSubType( Class<? extends SuperType> clazz )
{
SuperType obj …Run Code Online (Sandbox Code Playgroud)