powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / Java Reflection
12 сообщений из 12, страница 1 из 1
Java Reflection
    #38684609
JulT
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Всем привет.
Есть 2 класса:
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
public class A {
   
    private int x=3; 
    int y=5; 
    
    
   void  printFieldsClassA(){
       System.out.println("printFieldsClassA: x = "+x+" y = "+y); 
    } 
   
}



и второй:

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
public class B extends A{
   
     int w=1; 
     int t=1; 
   
   B(){
     
   } 
    
      void  printFieldsClassB(){
          System.out.println("printFieldsClassB: w = "+w+" t = "+t); 
      } 
    
}



Пытаюсь получить все поля одного и другой класса, при этом в А хочу поменять значение приватного поля х

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
public static List startRef(Class startClass,List listRes) throws ClassNotFoundException, IllegalArgumentException, IllegalAccessException{
           
           
           Field[] fi=startClass.getDeclaredFields();
           
           
           for (Field f : fi) {
               System.out.println("Field in class: "+startClass.getName()+" field: "+f); 
                  if(f.getName().equals("x")){
                      f.setAccessible(true);


                      f.setInt(Class.forName(startClass.getName()), 33);


                  }

           }
                  
                     if(startClass.getSuperclass()!=null){
                          startRef(startClass.getSuperclass(),listRes);
                     }
            
                   return listRes;
    }



Ошибка:
Код: java
1.
Exception in thread "main" java.lang.IllegalArgumentException: Can not set int field com.test.testappmaven.A.x to java.lang.Class


В строке:
Код: java
1.
f.setInt(Class.forName(startClass.getName()), 33);


первым параметром метода f.setInt должен быть класс, в котором находится данное поле, но у меня почему-то не получается, что я делаю не так?
Спасибо!
...
Рейтинг: 0 / 0
Java Reflection
    #38684615
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
JulTпервым параметром метода f.setInt должен быть класс, в котором находится данное поле
Да, с фига ли?
...
Рейтинг: 0 / 0
Java Reflection
    #38684618
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дык оно ведь приватное.
...
Рейтинг: 0 / 0
Java Reflection
    #38684623
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonДык оно ведь приватное.
f.setAccessible(true); на месте
...
Рейтинг: 0 / 0
Java Reflection
    #38684629
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну хитёр...
...
Рейтинг: 0 / 0
Java Reflection
    #38684649
JulT
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BlazkowiczJulTпервым параметром метода f.setInt должен быть класс, в котором находится данное поле
Да, с фига ли?
прочитала, но никак не могу понять что туда вставить в качестве первого параметра
когда делаю так:
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
A a=new A();

Class myClass= Class.forName("com.test.testappmaven.A");
        
    Field[] fi=myClass.getDeclaredFields();
           
           for (Field f : fi) { 
                        f.setAccessible(true);

                        f.setInt(a, 8);

           } 


все работает на ура
...
Рейтинг: 0 / 0
Java Reflection
    #38684662
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
JulTвсе работает на ура
Это вопрос?
...
Рейтинг: 0 / 0
Java Reflection
    #38684673
JulT
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BlazkowiczJulTвсе работает на ура
Это вопрос?
вопрос: что вставить в f.setInt(startClass, 9); вместо startClass?
...
Рейтинг: 0 / 0
Java Reflection
    #38684681
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
JulT
Код: java
1.
2.
A a=new A();
f.setInt(a, 8);


все работает на ура

JulTвопрос: что вставить в f.setInt(startClass, 9); вместо startClass?

JulT, сосредоточтесь.
...
Рейтинг: 0 / 0
Java Reflection
    #38684770
JulT
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BlazkowiczJulT
Код: java
1.
2.
A a=new A();
f.setInt(a, 8);


все работает на ура

JulTвопрос: что вставить в f.setInt(startClass, 9); вместо startClass?

JulT, сосредоточтесь.
Не могу врубиться.
В доке пишут:
public void setInt(Object obj, int i)
obj - the object whose field should be modified, т.е., что obj это объект, поле которого должно быть изменено. Т.е. startClass (искомый объект) должен быть типа А, сейчас я так понимаю он у меня типа Class, т.е. его нужно преобразовать в А, правильно?
...
Рейтинг: 0 / 0
Java Reflection
    #38684778
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
JulT,

У вас есть поле. Оно не статическое. Оно пренадлежит какому-то экземпляру aka "объекту". У разных экземпляров разное значение поля. Поэтому чтобы записать или прочитать значение не статического поля, надо иметь ссылку на объект\экземпляр в поле которого вы хотите что-то записать.

Почемы вы выдумали что там должен быть класс и усиленно держитель за эту мысль, мне не понятно.
...
Рейтинг: 0 / 0
Java Reflection
    #38685545
JulT
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BlazkowiczJulT,

У вас есть поле. Оно не статическое. Оно пренадлежит какому-то экземпляру aka "объекту". У разных экземпляров разное значение поля. Поэтому чтобы записать или прочитать значение не статического поля, надо иметь ссылку на объект\экземпляр в поле которого вы хотите что-то записать.

Почемы вы выдумали что там должен быть класс и усиленно держитель за эту мысль, мне не понятно.
Большое спасибо, разобралась.
Class c=obj.getClass(); в "c" получаем не сам объект, а его структуру, так сказать, мета-описание.
В общем не "с" нужно было таскать по рекурсии, а делать так Object real=c.newInstance();
...
Рейтинг: 0 / 0
12 сообщений из 12, страница 1 из 1
Форумы / Java [игнор отключен] [закрыт для гостей] / Java Reflection
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]