Dynamiczne tworzenie obiektu

0

Był jeden temat ale nie wyjaśniono tego,
tzn mi chodzi o to, że nazwa klasy jest w stringu, chcę z takiej nazwy utworzyc obiekt,
poza tym chcę wywoływać metody tego obiektu, nazwy metod tez w stringach,
schemat:

String klasa = "moja_klasa";
String metoda = "jaks_metoda";

//chce
<typ obiektu>klasa obiekt = new<nazwa klasy>klasa;
obiekt.<nazawa_metody>metoda;

String nowy_obiekt
//równiez nazwa obiektu może być stringiem
<typ obiektu>klasa <obiekt>nowy_obiekt = new<nazwa klasy>klasa;

0

W jaki sposób nadać typ tworzonemu obiektowi? Nadal tego nie wiem :(

0

Nie rozumiem co znaczy "nadać typ" obiektowi. Pokazałem ci jak tworzyc obiekty klas zadanych przez stringa. Czego chcesz więcej?

1

Chcesz rzutować obiekt utworzony za pomocą newInstance na konkretną klasę coś jak:

Object o = Class.forName("moja.Klasa").newInstance();
Klasa mojaKlasa = (Klasa)o;
0

Chcę utworzyć obiekt na podstawie dowolnej klasy, gdzie nazwa klasy jest w zmiennej typu String.
Naskrobałem coś takiego:

String widok="Cos_tam";
Object obiekt = Class.forName("zadanie_1."+widok).newInstance();

PS: Jave poznaje od wczoraj, nie denerwujcie się gdy piszę coś bez sensu;)
PS2: Dla mnie dokumentacja słabo tłumaczy co zrobić.
Link
przyjrzyjcie się adresowi :P

0

Skoro poznajesz jawę od wczoraj, to idę o zakład, że chcesz zrobić coś innego. Nie spotkałem książki, gdzie w drugim dniu nauki jest mowa o refleksjach. Napisz treść zadania, które robisz, jaki jest cel działania programu, a okaże się, że jest na to inna, prostsza, a do tego zwyczajna droga.

0

ta, ale on jak widzę podał link do dokumentacji msdn więc pewnie coś tam w c# umie.
@kemoc jeżeli zaczynasz dopiero programować w javie a wcześniej nie pisałeś C# to na razie odstaw to zagadnienie
Jak pisałeś w c# to dziwie się, że dokumentacja nic Ci nie mówi.
Sprawdź tutorial sunowski odnośnie mechanizmu refleksji.

0

Trochę obiektowo programować potrafię (klasy, obiekty, dziedziczenie, encapsulacja, interfejsy, polimorfizm znam).
Wzorzec MVC, singleton, factory, conttroler też.
Tyle że teraz uczę się Javy i szlifuje programowanie obiektowe i mam za zadanie zrobić mały serwer do komunikacji z przeglądarką.

0

Ale gdzie ci to ta refleksja potrzebna? Bo to jest taki mechanizm który się przydaje w 1% przypadków, a zwykle jak ktoś go używa to robi to bez sensu ;) Takie operacje o jakie pytasz przydają sie jak piszesz na przykład kontener IoC, albo w ogóle instancjonowaine obiektów na podstawie plików konfiguracyjnych.

0

Potrzebuję utworzyć obiekt na podstawie nazwy klasy z adresu żądania http, tak samo z nazwą metody.

0

@kemoc śmiem wątpić. Potrzebujesz tak zrobić bo tak sobie wymyśliłeś w swoim rozwiązaniu. Ale problem wyjściowy zapewne można rozwiązać znacznie prościej i pewnie powiedzielibyśmy ci jak, gdybyś opisał co chcesz osiągnąć, a nie jak chcesz to osiągnąć :)

0

Chciałbym żeby serwer obsługiwał logowanie/wylogowanie, sesję, połączenie do bazy, i ładował html, wysyłał do przeglądarki wiem że do tego JEE ale mam sam zrobić serwer :/
Chciałem to zrobić na wzorcu MVC.

0

To po prostu potrzebujesz zwyczajny dispatcher.

public void dispatch(String className, String methodName){
    Class clazz = Class.forName(className);
    Object o = clazz.newInstance();
    clazz.getMethod(methodName).invoke(o);
}

Kod uproszczony, bez obsługi błędów czy parametrów żądania. Warto też sobie zrobić po drodze cache (na sesję) by trzymać w nim przynajmniej część utworzonych obiektów (tych nie mających stanu).

0

Dokładnie to chcę napisać we front controlerze, tylko że do tej pory korzystałem z REQUEST_URI którą udostępniał serwer teraz nie wiem skąd pobrać adres żądania.

0

Wrzuć jakiś kod co już masz.

0

package server;

import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;
//import java.lang.Class;

import java.util.ArrayList;
import java.util.List;

//import java.applet.AppletContext;

//import java.util.HashMap;
//import java.util.Map;
//import java.util.Map.Entry;
        

public class Server {
      
    private static final int    PORT = 80;
    private static ServerSocket server_socket = null;
    private static Socket       client_socket = null;
    
    private InputStream data_in = null;
    private OutputStream data_out = null;
    
    public List<String> data_out_2 = new ArrayList<String>();
    
    public static boolean flag = true;
    public  static String       APP_PATH    = "localhost:"+PORT;//APP_PATH  
    
    
    public static void main(String[] args) throws IOException{
        Server server_ = new Server();
        //boolean flag = true;
            server_.connect();
         
    }

    public void connect() throws IOException{
        server_socket = null;
        try {
           server_socket = new ServerSocket(PORT);
        }
        catch(IOException e){
            System.err.println("Nie mozna utworzyc gniazda na porcie: "+PORT);
            System.exit(1);
        }
        
        System.out.print("Trwa łączenie...");
        
        Thread th = new Thread(new Runnable(){
            @Override
            public void run(){
                System.out.println("\n Nasluch na porcie: "+PORT);
            }
        });
        th.start();
        
        client_socket = null;
        try{
            client_socket = server_socket.accept();
        
        }
        catch(IOException e){
            Server.flag = false;
            System.err.println("Nasluch nie powiodl sie.");
            th.interrupt();
            System.exit(2);
        }
        
        
            final PrintWriter data_pwr = new PrintWriter(client_socket.getOutputStream(), true);
            final BufferedReader data_brr = new BufferedReader( new InputStreamReader( client_socket.getInputStream() ) );
             
            /** 
             *Dane testowe 
             */
            final View view_1 = new View();
            this.data_out_2.add(0,"5");
            this.data_out_2.add(1,"6");
            this.data_out_2.add(2,"7");
            this.data_out_2.add(3,"8");
            this.data_out_2.add(4,"9");
            //wypelniony html danymi
            final String data_out_3 = view_1.account_list(data_out_2);
            
        
        th = new Thread(new Runnable() {
            @Override
            public void run() {
                
                try{
                    Thread.sleep(3000);
                    while(true){
                        //data_pwr.println("response");

                        String input = data_brr.readLine();
                        if( input.equals("end") ){
                               Server.flag = false;
                        }
                        data_pwr.println(data_out_3);
                        //System.out.print(data_out_3);
                        
                        data_pwr.close();
                        data_brr.close();
                        client_socket.close();
                        server_socket.close();
                        
                        break;
                    }
                }
                catch(Exception e){
                    Server.flag = false;
                    System.err.println("Niespodziewany blad.");   
                }
                
            }
        });
        th.start();
        
    }
    
 }

Serwer się wyłącza po pierwszym żądaniu przeglądarki, próbowałem wywoływać connect() w pętli(serwer uruchomiony, automatyczne wywołanie connect() w main(), żadanie->obsługa żądania->wyłączenie serwera i wywołanie connect()... ale potem mam wyjątek: Niespodziewany blad pomimo że wszystko jest zamykane tyle że w wątku.

0

Przepraszam za dubla ale może ktoś pomoże?

0
  1. To co robisz jest niebezpieczne. Ktoś złośliwy może przekazać Ci jakąś inną klasę i metodę.
  2. Żądanie HTTP powinno być niezależne od stosowanej technologi po stronie serwera (np. zmieniamy .NET na Javę, a html pozostaje taki sam).

Zapoznaj się jak, jest to np. robione w Struts lub jsf.

0
__krzysiek85 napisał(a):
  1. To co robisz jest niebezpieczne. Ktoś złośliwy może przekazać Ci jakąś inną klasę i metodę.

Do tego służy obsługa żądania, po prostu albo lista kontrolerów we frontController albo (tak się robi) katalog controllers i tam wszystkie kontrolery i trzeba sprawdzać czy żądanie odnosi się do istniejącego kontrolera-klasy i cz istnieje wywoływana metoda.

1 użytkowników online, w tym zalogowanych: 0, gości: 1