NoSuchMethodError для вызова valueOf() типа подкласса Enum с отражением?

К счастью, для решения этой моей проблемы я мог бы использовать Java: создание экземпляра перечисления с помощью отражения (следующая строка: Enum.valueOf((Class<Enum>) class.forName("me.example.enums.MyEnumType"), value);), однако мне все еще интересно, почему это не сработало изначально.

Я пытался назвать свой собственный подкласс Enum valueOf(String) метод с использованием отражения, но он бросил NoSuchMethodError,

java.lang.NoSuchMethodException: me.example.enums.MyEnumType.valueOf() 

Минимальным примером является следующее:

package me.example.enums;

public enum MyEnumType
{
    THIS,
    THAT;
}

а также

package me.example;

import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;

public class MainClass
{
    public static void main(String[] args)
    {
        String enumClassPath = "me.example.enums.MyEnumType";
        Object object;
        try
        {
            Class<?> clazz = Class.forName(enumClassPath);
            Method method = clazz.getMethod("valueOf");
            object = method.invoke(null, "THAT");
        }
        catch (ClassNotFoundException | InvocationTargetException | NoSuchMethodException | IllegalAccessException e)
        {
            e.printStackTrace();
            throw new RuntimeException(e);
        }
    }
}

Который бросает:

java.lang.NoSuchMethodException: me.example.enums.MyEnumType.valueOf()
    at java.lang.Class.getMethod(Unknown Source)
    at me.example.MainClass.main(MainClass.java:15)
Exception in thread "main" java.lang.RuntimeException: java.lang.NoSuchMethodException: me.example.enums.MyEnumType.valueOf()
    at me.example.MainClass.main(MainClass.java:21)
Caused by: java.lang.NoSuchMethodException: me.example.enums.MyEnumType.valueOf()
    at java.lang.Class.getMethod(Unknown Source)
    at me.example.MainClass.main(MainClass.java:15)

я думал valueOf() был статический метод, почему он не существует? Что я делаю неправильно?

1 ответ

Решение

Class#valueOf нужен String параметр:

Method method = clazz.getMethod("valueOf", String.class);
Другие вопросы по тегам