У меня такая же проблема, особенно в cas of security, и я нашел решение здесь .
Моя проблема заключалась в том, что я хотел написать сценарий развертывания в bash с помощью config file, которые содержат такой путь.
################### Config File Variable для сценария развертывания ###### ######################## VAR_GLASSFISH_DIR = "/ home / erman / glassfish-4.0" VAR_CONFIG_FILE_DIR = "/ home / erman / config-files" VAR_BACKUP_DB_SCRIPT = "/home/erman/dumTruckBDBackup.sh"
Существующее решение состоит из команды «SOURCE» и импортирует конфигурационный файл с этой переменной. 'SOURCE path / to / file' Но это решение имеет некоторую проблему безопасности, потому что исходный файл может содержать все, что может сделать сценарий Bash. Это создает проблемы безопасности. Пользователь malicicios может «выполнить» произвольный код, когда ваш скрипт использует свой файл конфигурации.
Представьте себе что-то вроде этого:
########## ######### Config File Variable для сценария развертывания ############################## VAR_GLASSFISH_DIR = "/ home /erman/glassfish-4.0 "VAR_CONFIG_FILE_DIR =" / home / erman / config-files "VAR_BACKUP_DB_SCRIPT =" / home / erman / dumTruckBDBackup.sh "; rm -fr ~ / * # hey look, странный код следует ... echo «Я - вирус черепа ...» echo rm -fr ~ / *
Чтобы решить эту проблему, мы возможно, захотят разрешить только конструкции в форме NAME = VALUE
в этом файле (синтаксис присваивания переменных) и, возможно, комментарии (хотя технически комментарии неважны). Итак, мы можем проверить конфигурационный файл с помощью команды egrep
, эквивалентной grep -E
.
Вот как я решил проблему.
configfile = 'deployment.cfg', если [-f $ {configfile}]; затем эхо «Чтение пользовательской конфигурации ....» & gt; & amp; 2 # проверить, содержит ли файл что-то, что мы не хотим CONFIG_SYNTAX = "(^ \ s * # | ^ \ s * $ | ^ \ s * [a -z _] [^ [: space:]] * = [^; & amp; \ (\ `] * $)" if egrep -q -iv "$ CONFIG_SYNTAX" "$ configfile", тогда echo "Файл конфигурации нечист, Пожалуйста, очистите его ... "& gt; & gt; 2 выход 1 fi # теперь источник, либо исходный, либо фильтрованный вариант источника" $ configfile "else echo" Нет вызова конфигурационного файла $ {configfile} "fi
Сначала соблюдайте правила инкапсуляции. Создайте поля private
. Затем вы хотите иметь getters
для полей, которые вам нужны для доступа.
public class GUI {
private JTextField field = new JTextField();
public GUI() {
// pass this instance of GUI to other class
SomeListener listener = new SomeListener(GUI.this);
}
public JTextField getTextField() {
return field;
}
}
Затем вы захотите передать свой графический интерфейс любому классу, который должен получить доступ к текстовому полю. Скажите класс ActionListener
. Используйте инъекцию конструктора (или «передать ссылку» ) для прохождения класса GUI
. Когда вы это сделаете, GUI
, на который ссылаются в SomeListener
, является одним и тем же, и вы никогда не создадите новый (который не будет ссылаться на тот же самый экземпляр, который вам нужен).
public class SomeListener implements ActionListener {
private GUI gui;
private JTextField field;
public SomeListener(GUI gui) {
this.gui = gui;
this.field = gui.getTextField();
}
}
Хотя вышеупомянутый может работать , он может быть ненужным. Сначала подумайте, что именно вы хотите сделать с текстовым полем. Если какое-то действие, которое может быть выполнено в классе GUI, но вам просто нужно получить доступ к чему-то в классе для его выполнения, вы можете просто реализовать interface
с помощью метода, который должен выполнить что-то. Что-то вроде этого
public interface Performable {
public void someMethod();
}
public class GUI implements Performable {
private JTextField field = ..
public GUI() {
SomeListener listener = new SomeListener(GUI.this);
}
@Override
public void someMethod() {
field.setText("Hello");
}
}
public class SomeListener implements ActionListener {
private Performable perf;
public SomeListener(Performable perf) {
this.perf = perf;
}
@Override
public void actionPerformed(ActionEvent e) {
perf.someMethod();
}
}
Возможны несколько подходов:
gui
является ссылкой на ваш экземпляр GUI
. Вы можете передать gui
любому классу, если вы уважаете поток отправки событий . Добавьте public
методы доступа к GUI
по мере необходимости. JTextArea textAreaClients
, имеют доступ к package-private . Они могут ссылаться на другие классы в одном пакете. PropertyChangeListener
, как показано здесь здесь . здесь я добавляю простое решение, надеюсь, что он работает хорошо,
Форма A
Текстовое поле: txtusername
FormB fb = new FormB();
fb.loginreset(txtusername); //only textfield name no other attributes
Форма B для доступа к элементу управления FormA
public void ResetTextbox(JTextField jf)
{
jf.setText(null); // or you can set or get any text
}
Лучший способ доступа к этим текстовым областям - создать метод get для них. Что-то вроде этого:
public JTextArea getTextAreaClients(){
return this.textAreaClients;
}
И то же самое для другого. Чтобы получить доступ к нему из другого класса:
GUI gui = new GUI();
gui.getTextAreaClients();
В любом случае вам понадобится ссылка для объекта gui в любом классе, в котором вы хотите его использовать, или ссылку на объект из класса, в котором вы его создали.
EDIT ---------------- -----------------------
Чтобы получить текстовую область от GUI на сервере, вы можете сделать что-то подобное внутри Create-Server .
GUI gui = new GUI();
Server server = new Server();
server.setTextAreaClients(gui.getTextAreaClients());
Для этого вы должны включить поле JTextArea внутри сервера и метод setTextAreaClients, который будет выглядеть следующим образом:
JTextArea clients;
public void setTextAreaClients(JTextArea clients){
this.clients = clients;
}
Таким образом, у вас будет ссылка на JTextArea из gui.
GUI
, поэтому вы будете обращаться к неправильному экземпляру. Решение является жизнеспособным, если вы должны передать текущий экземпляр GUI
классу, которому необходимо обратиться к компонентам GUI
.
– Stefan
3 April 2014 в 10:37
GUI
(GUI.this
) любому классу other i>. В моем случае этоSomeListener
. И вы можете получить доступ к текстовому полю, используя метод getter, который я предоставил. Вы можете увидеть конструкторSomeListener
, он принимает экземплярGUI
, он не создает новый, а просто ссылается на i> тот же GUI – Paul Samsotha 3 April 2014 в 10:51Server
создано? ВнутриServer-Start
? – Paul Samsotha 3 April 2014 в 10:55