标签: reflection

Java:NoSuchMethodException,即使该方法存在

所以我有一个定义了 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)

java reflection

0
推荐指数
1
解决办法
533
查看次数

Mirror.Child 标签什么时候为 nil?

各州的文件Mirror.Child

当标签组件不为零时,它可能表示存储属性或活动枚举案例的名称。如果将字符串传递给descendant( : :) 方法,则使用标签进行查找。

什么时候Mirror.Child label值为零?

reflection mirror swift

0
推荐指数
1
解决办法
425
查看次数

检查interface{}是否是struct的ptr

我想检查给定的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)

reflection struct pointers go assertion

0
推荐指数
1
解决办法
2617
查看次数

重写内部方法(反射、发射)

我想创建以下类:

    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)

如何调用内部方法,创建内部类型的实例 - 我或多或少弄清楚了。为此,使用反射对我来说就足够了。

但我仍然无法通过重写另一个程序集中指定的虚拟内部方法来弄清楚自己。

更新

回应评论:

我知道这个问题可以在没有这样的课程的情况下解决 - 我知道还有许多其他解决方案或解决方法。我自己在实践中使用了其中的许多内容。由于我不知道如何解决这个问题,我现在还没有停止任何开发。

c# reflection wpf reflection.emit internals

0
推荐指数
1
解决办法
1206
查看次数

如何获取 Java 14 方法引用的 MethodInfo?

我本质上是在问与这个老问题相同的问题,但针对的是 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中有更优雅的解决方案吗?

java reflection lambda java-14

0
推荐指数
1
解决办法
182
查看次数

从记录中获取属性

我正在寻找一种方法来获取记录构造函数“字段”上定义的属性。

// 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:)。 …

c# reflection record

0
推荐指数
1
解决办法
1199
查看次数

Mongodb C# - 使用泛型注册类映射有效,但使用类型失败

我有一个对象集合,每个对象都有一个属性 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)

c# reflection serialization mongodb

0
推荐指数
1
解决办法
932
查看次数

Scala:将字符串转换为 lambda

我希望能够解析字符串"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 => …

reflection lambda scala

0
推荐指数
1
解决办法
107
查看次数

检查方法上是否存在 @Override 注释

我有一个 java.lang.reflect.Method 方法,我想检查它是否用 @Override 注释标记。

尝试使用 method.isAnnotationPresent(Override.class) 执行此操作,但此方法不适用于此注释。还尝试了 MergedAnnotations.from(method).isPresent() 但它也不会为我的带有 @Override 的方法返回 true 。

可以检查一下吗?

java reflection overriding

0
推荐指数
1
解决办法
107
查看次数

为什么在调用 Constructor.newInstance() 时不能使用 lambda 表达式?

我正在尝试使用 实例化一个对象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)

java reflection lambda

0
推荐指数
1
解决办法
92
查看次数