2015-01-16 5 views
0

Я создал объект SocketClient, который я разместил в банке, я хочу вызвать его, когда запускается java-программа, чтобы начать сокет, а затем я могу подключиться к нему через внешнее приложение. Как я могу назвать объект в начале программы.Как вставить объект в класс в банке?

SocketClient

public class SocketClient { 

    private boolean isCon = false; 

    public SocketClient() { 

    } 

    public void communicate() { 
     while(!isCon) { 
      try { 
       Socket socket = new Socket("localHost", 9090); 
       System.out.println("Connected"); 
       isCon = true; 
       ObjectOutputStream oos = new ObjectOutputStream(socket.getOutputStream()); 
       AbstractScript passScript = getAbstractScript(); 
       System.out.println("Passing Object"); 
       oos.writeObject(passScript); 
      } catch (Exception e) { 
       e.printStackTrace(); 
      } 
     } 
    } 


    public AbstractScript getAbstractScript() throws Exception { 
     Class reflectClass = AbstractScript.class; 
     Object construct; 
     construct = reflectClass.newInstance(); 
     AbstractScript newAbstractScript = (AbstractScript) construct; 
     return newAbstractScript; 
    } 

    public boolean isRunningScript() throws Exception { 
     Method method; 
     Class reflectClass = AbstractScript.class; 
     if(reflectClass != null) { 
      method = reflectClass.getDeclaredMethod("isRunning", Boolean.class); 
      try { 
       Object returnValue = method.invoke(null); 
       Boolean value = (Boolean) returnValue; 
       return value; 
      } catch (Exception e) { 
       e.printStackTrace(); 
      } 
     } 
     return false; 
    } 
} 
+0

«Я создал объект SocketClient, который я разместил в банке». Что это значит? Вы сделали класс и составили его? Если это так, он будет загружен загрузчиком классов, если банка находится в вашем пути к классам. В этом случае вы можете создать экземпляр объекта «SocketClient» в своем приложении и вызвать его так же, как и любым другим способом. –

+0

У меня есть внешнее приложение, которое я тоже добавляю в функциональность, я предполагаю, что, помещая файл .class в банку, он не будет запущен, если его не вызывать. Мне нужно позвонить, но не знаю, как это сделать. –

+0

Как правило, чтобы получить объект в банке, вы делаете большую часть конструкции снаружи, а затем устанавливаете ее внутри, дергая такелаж. Хотя некоторые люди утверждают, что использовали щипцы. –

ответ

0

Давайте рассмотрим простой пример, который может помочь вам сделать то, что вы хотите.

Предположим, что вы компилируете SocketClient класс в файл банку под названием MySocketStuff.jar и ваше внешнее приложение упаковано в банку под названием MyApplication.jar

Для того, чтобы ваше внешнее приложение использовать ваш SocketClient класса, вам просто нужно убедитесь, что jar находится в вашем пути к классу при запуске приложения, поэтому загрузчик классов загрузит эти классы.

Тогда вы можете использовать класс, как и в любой другой среде разработки.

Предположим, что ваш метод main имеет что-то простое, как это:

import my.socket.stuff.package.SocketClient; // you'll need the jar on your class path when you compile this file! 

public class MyMainClass { 
    public static void main(String[] args) { 
     // instantiate the object 
     SocketClient mySocketClient = new SocketClient(); // create the object 
     // do stuff 
     mySocketClient.communicate(); 
     // ... 
    } 
} 

После того, как вы собираете эту банку (и вы можете решить, если вы хотите включить импортированные класс в банке или нет ...), вам может вызывать вашу программу из командной строки следующим образом:

java -cp "<path to MySocketStuff.jar>;<path to MyApplication.jar>" MyMainClass 

Помогает ли это?

+0

Можно ли использовать отражение на «MyApplication.jar» и отправить его через сокет с этим? –

+0

@JordanFlorchinger Я не уверен, что вы подразумеваете под «на MyApplication.jar», но вы можете использовать рефлексию для создания любых объектов, которые вы хотите от своего основного приложения, но это действительно нужно делать только тогда, когда вы не знаете тип вашего объекта во время компиляции или если библиотека не всегда будет присутствовать при запуске. Похоже на случай использования, что вы слишком усложняете, но я не знаю точно. –

+0

Я просто имею в виду пример, который вы предоставили. Я собираюсь иметь кратные одно и то же приложение, и мне нужно получить, если они загружены или нет, и в этом смысле загруженный означает больше, чем просто, если процесс виден. –

Смежные вопросы