Java

Java проблема с рефлексией.

Программа должная менять поле , со сменой инта она справляется, а вот стринг просто ошибка . Что не так и что можно поменять
 import java.io.File; 
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.lang.reflect.Parameter;

public class Main {
public static void main(String[] args) throws IllegalAccessException {


Person p = new Person("w",1);


Class cl = p.getClass();



Field[] f = cl.getDeclaredFields();
for(Field f1: f) {
f1.setAccessible(true);
f1.set(p, "qw");
System.out.println(p.getName());


}

}

}



class Person{


private int age;

private String name;

public int getAge() {
return age;
}

public void setAge(int age) {
this.age = age;
}

public String getName() {
return name;
}

public void setName(String name) {
this.name = name;
}


public Person(String name, int age) {
this.age = age;
this.name = name;

}

public void say(){

System.out.println("hello");

}

}
Потому что ты в цикле каждому полю присваивашь "qw". А у тебя два поля: строковое и целочисленное, соответственно когда ты пытаешься присвоить строку в целочисленное поле получаешь ошибку, вполне логично
Владимир Самсонов
Владимир Самсонов
8 869
Лучший ответ
может наоборот -- со текстовым прокатывает, а с целочисленным выпадает в ошибку?
В вашем коде вы используете рефлексию для изменения значений полей в классе Person. Вы успешно меняете значение поля типа int, но получаете ошибку при попытке изменить значение поля типа String.
Ошибка возникает потому, что поле name в классе Person является приватным (private). Для того чтобы изменить значение приватного поля с помощью рефлексии, вам необходимо вызвать метод setAccessible(true) для этого поля перед изменением значения.
Вот исправленный код:
 import java.lang.reflect.Field; 

public class Main {
public static void main(String[] args) throws IllegalAccessException {
Person p = new Person("w", 1);

Class cl = p.getClass();

Field[] f = cl.getDeclaredFields();
for (Field f1 : f) {
f1.setAccessible(true);
if (f1.getType() == String.class) {
f1.set(p, "qw");
}
System.out.println(p.getName());
}
}
}

class Person {
private int age;
private String name;

public int getAge() {
return age;
}

public void setAge(int age) {
this.age = age;
}

public String getName() {
return name;
}

public void setName(String name) {
this.name = name;
}

public Person(String name, int age) {
this.age = age;
this.name = name;
}

public void say() {
System.out.println("hello");
}
}