В Java все находится в форме класса.
Если вы хотите использовать любой объект, тогда у вас есть две фазы:
Пример:
Object a;
a=new Object();
То же самое для концепции массива
Item i[]=new Item[5];
i[0]=new Item();
Если вы не дают секцию инициализации, тогда возникает NullpointerException
.
Как и раньше, вы должны использовать:
Object value = field.get(objectInstance);
Другой способ, который иногда предпочитается, вызывает геттер динамически. Пример кода:
public static Object runGetter(Field field, BaseValidationObject o)
{
// MZ: Find the correct method
for (Method method : o.getMethods())
{
if ((method.getName().startsWith("get")) && (method.getName().length() == (field.getName().length() + 3)))
{
if (method.getName().toLowerCase().endsWith(field.getName().toLowerCase()))
{
// MZ: Method found, run it
try
{
return method.invoke(o);
}
catch (IllegalAccessException e)
{
Logger.fatal("Could not determine method: " + method.getName());
}
catch (InvocationTargetException e)
{
Logger.fatal("Could not determine method: " + method.getName());
}
}
}
}
return null;
}
Также имейте в виду, что когда ваш класс наследуется от другого класса, вам необходимо рекурсивно определить поле. например, для извлечения всех полей данного класса,
for (Class<?> c = someClass; c != null; c = c.getSuperclass())
{
Field[] fields = c.getDeclaredFields();
for (Field classField : fields)
{
result.add(classField);
}
}
Хотя мне не совсем ясно, чего вы пытаетесь достичь, я обнаружил очевидную ошибку в вашем коде: Field.get()
ожидает объект, который содержит поле в качестве аргумента, а не какое-либо (возможное) значение этого поля. Таким образом, вы должны иметь field.get(object)
.
Поскольку вы, кажется, ищете значение поля, вы можете получить это как:
Object objectValue = field.get(object);
Не нужно создавать тип поля и создать пустое значение / значение по умолчанию; или, возможно, что-то я пропустил.
Вы должны передать объект в get метод поля , поэтому
Field field = object.getClass().getDeclaredField(fieldName);
field.setAccessible(true);
Object value = field.get(object);
object.getClass()
вернет вам этот объект класса)
– Dmitry Spikhalskiy
17 June 2016 в 11:43
Integer typeValue = 0;
try {
Class<Types> types = Types.class;
java.lang.reflect.Field field = types.getDeclaredField("Type");
field.setAccessible(true);
Object value = field.get(types);
typeValue = (Integer) value;
} catch (Exception e) {
e.printStackTrace();
}
Вы вызываете get с неправильным аргументом.
Это должно быть:
Object value = field.get(object);
Я использую отражения в реализации toString () моего класса предпочтений, чтобы увидеть члены класса и значения (простая и быстрая отладка).
Упрощенный код, который я использую:
@Override
public String toString() {
StringBuilder sb = new StringBuilder();
Class<?> thisClass = null;
try {
thisClass = Class.forName(this.getClass().getName());
Field[] aClassFields = thisClass.getDeclaredFields();
sb.append(this.getClass().getSimpleName() + " [ ");
for(Field f : aClassFields){
String fName = f.getName();
sb.append("(" + f.getType() + ") " + fName + " = " + f.get(this) + ", ");
}
sb.append("]");
} catch (Exception e) {
e.printStackTrace();
}
return sb.toString();
}
Я надеюсь, что это поможет кому-то, потому что я также искал.
BaseValidationObject
? – randytan 9 December 2015 в 11:13object
класс не имеет методаgetMethods()
. Есть рекомендации? – randytan 10 December 2015 в 05:51