需要在枚举类上调用该方法,我没有直接的构建依赖性。我想使用Java的反射在enum类上调用该方法。
我也尝试过使用Field,但没有运气
class myClass
{
public void validateObjectType(Object obj)
{
Class<?> cls = Class.forName("package1.myEnum");
Class [] parameterTypes = {Object.class};
Method method = cls.getDeclaredMethod("getMyEnum", parameterTypes );
String enumType = (String)method.invoke(null, new Object[]{obj1});
Field enumTypeField = cls.getField(enumType );
// -- invoke method getLocalName() on the object of the enum class.??
Class [] parameters = {String.class};
Method method1= cls.getDeclaredMethod("getLocalName", parameters);
String localizedName = (String) method1.invoke(enumTypeField , new Object[] {enumType});
}
}
但是我在
遇到错误method1.invoke(enumTypeField , new Object[] {}) //
错误:
java.lang.IllegalArgumentException: object is not an instance of declaring class
套餐1:
class enum myEnum
{
A,
B;
public static myEnum getMyEnum(Object a)
{
// business logic.
// -- based on the type of object decide MyEnum
if (null != object) return B;
else return A ;
}
public String getLocalName(String value)
{
if (value.equal(A.toString) return "my A";
else if(value.equal(B.toString) return "my B";
}
}
套餐2:
//-在这里我没有依赖包1。 //--不想添加,因为它会导致循环依赖
class myClass
{
public void validateObjectType(Object obj)
{
Class<?> cls = Class.forName("package1.myEnum");
Class [] parameterTypes = {Object.class};
Method method = cls.getDeclaredMethod("getMyEnum", parameterTypes );
?? = (??)method.invoke(null, new Object[] {obj1}); // will get the Enum but dont have acces
// -- invoke method getLocalName() on the object of the enum class.??
}
}
答案 0 :(得分:1)
您的错误是试图将getMyEnum
的结果转换为String
。 getMyEnum
返回myEnum
,因此您不应将其转换为String
。只需将其保留为Object
:
Class<?> cls = Class.forName("package1.myEnum");
Class [] parameterTypes = {Object.class};
Method method = cls.getDeclaredMethod("getMyEnum", parameterTypes);
Object enumValue = method.invoke(null, obj);
由于您说过getLocalName
实际上不接受任何参数,因此您只需获取方法并按如下方式调用它即可:
Method method1= cls.getDeclaredMethod("getLocalName");
String localizedName = (String) method1.invoke(enumValue); // <-- using enumValue here!
System.out.println(localizedName);
您不需要enumTypeField
变量,因为enumValue
已经是我们要调用getLocalName
的枚举值。
答案 1 :(得分:0)
Method.invoke
调用需要一个方法类型来自的对象作为第一个参数。您正在传递Field
(在第二次通话中)。
如果要通过名称获取特定的枚举,则可以使用valueOf
方法并将其传递。