Изменить значение в приватном элементе в JFrame с отражением - PullRequest
0 голосов
/ 06 октября 2018

Здравствуйте,

У меня есть следующий код, я хочу изменить значение экземпляра с именем number на любое значение

У меня есть оба класса втот же пакет

ReflectionOnClass.class

import javax.swing.*;
import java.awt.*;

public class ReflectionOnClass extends JFrame {

private int number = 2;
private JLabel jLabel = new JLabel("X: " + number);

public ReflectionOnClass() {
    setLayout(new FlowLayout());
    setPreferredSize(new Dimension(200,200));
    add(jLabel);
    setDefaultCloseOperation(3);
    setLocationRelativeTo(null);
    pack();
    setVisible(true);
    }
}

ExecReflection.class

import java.lang.reflect.Field;
import java.util.stream.Stream;

public class ExecReflection {

private static final String C = "ReflectionOnClass";

public ExecReflection() {

    try {
        final Field field = Class.forName(C).getDeclaredField("number");
        field.setAccessible(true);
        final ReflectionOnClass rF = new ReflectionOnClass();
        field.set(rF , 100);
        mostrar("Value number: " + field.get(rF));
    }catch (Exception ex){
        ex.printStackTrace();
    }
 }

 public <T> void mostrar(final T t){System.out.println(t);}
 public static void main(String ...gaga) {
    final Runnable r = ExecReflection::new;
    r.run();
 }
}

вывод правильныйкак в изображении, но в JFrame нет

result

нет возможности изменить значение указанной переменной до запуска JFrame?

Обновление Это было то, что я хотел, чтобы изменить значение до запуска JFrame, но с отражением

final Field field = Class.forName(C).getDeclaredField("jLabel");
field.setAccessible(true);
if(field.getType() == JLabel.class) {
  final JLabel j = (JLabel)field.get(ReflectionOnClass.class.newInstance());
  j.setText("X: " + 5000);
}

enter image description here

Ответы [ 2 ]

0 голосов
/ 10 октября 2018

Ничего не меняется, потому что вы на самом деле не меняете отображаемое значение

private int number = 2;
private JLabel jLabel = new JLabel("X: " + number);

Вам необходимо получить доступ к полю jLabel, так как это ваше отображаемое значение, и изменить текст на что-то другое, если number используется в других местах, тогда вам, вероятно, нужно изменить их оба, поэтому number на значение этого примера 100 и текст jLabel на X: 100

0 голосов
/ 06 октября 2018

Это возможно.Вы можете добавить эти функции в ReflectionOnClass:

public void setNumber(int num){
    this.number = num;
    label.setText("X: " + this.number);
}

public int getNumber(){
    return this.number;
}

и просто вызывать их из ExecReflection:

final ReflectionOnClass rF = new ReflectionOnClass();
rF.setNumber(4);
System.out.println("Value number: " + rF.getNumber());
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...