Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Java [игнор отключен] [закрыт для гостей] / Java Reflection / 12 сообщений из 12, страница 1 из 1
01.07.2014, 12:15
    #38684609
JulT
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Java Reflection
Всем привет.
Есть 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
01.07.2014, 12:19
    #38684615
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Java Reflection
JulTпервым параметром метода f.setInt должен быть класс, в котором находится данное поле
Да, с фига ли?
...
Рейтинг: 0 / 0
01.07.2014, 12:19
    #38684618
mayton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Java Reflection
Дык оно ведь приватное.
...
Рейтинг: 0 / 0
01.07.2014, 12:21
    #38684623
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Java Reflection
maytonДык оно ведь приватное.
f.setAccessible(true); на месте
...
Рейтинг: 0 / 0
01.07.2014, 12:23
    #38684629
mayton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Java Reflection
Ну хитёр...
...
Рейтинг: 0 / 0
01.07.2014, 12:35
    #38684649
JulT
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Java Reflection
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
01.07.2014, 12:42
    #38684662
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Java Reflection
JulTвсе работает на ура
Это вопрос?
...
Рейтинг: 0 / 0
01.07.2014, 12:46
    #38684673
JulT
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Java Reflection
BlazkowiczJulTвсе работает на ура
Это вопрос?
вопрос: что вставить в f.setInt(startClass, 9); вместо startClass?
...
Рейтинг: 0 / 0
01.07.2014, 12:48
    #38684681
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Java Reflection
JulT
Код: java
1.
2.
A a=new A();
f.setInt(a, 8);


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

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

JulT, сосредоточтесь.
...
Рейтинг: 0 / 0
01.07.2014, 14:01
    #38684770
JulT
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Java Reflection
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
01.07.2014, 14:06
    #38684778
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Java Reflection
JulT,

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

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

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

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


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