wskazywanie obiektów zmienną String

0

Witam, mam pytanie, otóż dowiedziałem się, że nie można tego tak łatwo zrobić, ale wiem iż jest to możliwe.
nie jestem dobry w javie (ale migrowałem z ActionScript 3)
chodzi mi o coś takiego:

Object myObj=...;
Object getObject(String name)
{
return this[name];
}
//... gdzies w kodzie:
getObject("myObj").doSomething();

edit:// potrzebuję też wskazywania metod :)

0

Chodzi ci pewno o tworzenie obiektów na podstawie nazwy klasy?

0

hehe to tez by sie przydalo ale moze przyblize moj projekt: (MVC pattern)

socketserver laczy z klientem, ten wysyla linię komendy:

path_do_modelu akcja_jaką_ma_zrobic_konroller_na_tym_modelu dane_od_klienta

w javie muszę sparsować: wydobyć typ i sciezke do obiektu na dysku, jednorazowo odwołać się do kontrolera obiektu danego typu, wywołać jego metodę, czyli akcja_jaką_ma_zrobić_kontroller_na_tym_modelu z parametrem bytearray tez sparsowanym...

czyli muszę napisac metodę:
getObjectByPath(String path)
{
//path moze byc np: some.sometype/child.sometype2/child.sometype3
//wiem jak przechodzić po ścieżcie (przerobioną na tablicę uzywając Split("/") )

}

potrzebuję jedynie możliwości: zamiast obiekt.property coś takiego:

String wskaznik="property";
obiekt[wskaznik];

lub po prostu: getObject("someObj/child/anotherChild")
ma mi zwrócić rootObject.someObj.child.anotherChild

0

nadal nie do końca rozumiem co chcesz zrobić. Za dużo tu AS podejścia. W javie wykonujesz to w ten sposób, że klient woła kontroler z określonymi danymi, a kontroler na podstawie danych wywołuje metodę obiektu. Nie ma nigdzie składowania obiektów. Po prostu robisz new MyObject() w kontrolerze i lecisz dalej.

0

Mi sie wydaje ze autor chce zwykla mape:
Map<String, Object> mapa = new HashMap<String, Object>();
gdzie String to klucz - sciezka, a Object to wartosc, czyli zwracany obiekt modelu dla danej sciezki. Object mozna zastapic jakims interfejsem czy innym typem jesli trzeba.

0

aha... a ja potrzebuję drzewo obiektów, więc jeśli typ mapy to String,Object to jak mam zadeklarowac taką mapę by na jednym poziomie dzrewa znajdowaly sie rozne typy: np map oraz ByteArray?

czy naprawdę nie ma czegoś takiego zeby uzyskać wartość obiektu o nazwie podanej w zmiennej String?

0

Ale jest i TreeMap http://www.roseindia.net/java/jdk6/TreeMapExample.shtml implementacja drzewka.

0

ok, dzięki, pytanie tylko czy to ze nie ma tego co w as3 (wskazywanie dynamiczne, dostęp dynamiczny do zmiennych) wpływa na wydajność?

0
borovsky napisał(a)

czy naprawdę nie ma czegoś takiego zeby uzyskać wartość obiektu o nazwie podanej w zmiennej String?

No kurcze, chyba jasno napisalem? Poczytaj o tej mapie. Co do drzewek to nie rozumiem kompletnie o co Ci chodzi, ani Koziolkowi - co ma TreeMap do drzewek, poza faktem ze wewnetrznie to drzewo czerwono-czarne?

0
borovsky napisał(a)

sciezke do obiektu na dysku

Jakie znowu obiekty na dysku?

Java jest językiem statycznie typowanym z dziedziczeniem, wielodziedziczeniem interfejsów i polimorfizmem, więc aby zrobić coś takiego : rootObject.someObj.child.anotherChild
musisz mieć:

class Main{
   RootObject rootObject = new RootObject();
   void foo(){
        rootObject.someObj.child.anotherChild.jakasMetoda();
  }
}

class RootObject{
   public SomeObj someObj = new SomeObj();
}

class SomeObj{
   public Child child = new Child();
}

class Child{
   public AnotherChild anotherChild = new AnotherChild();
}

class AnotherChild{
  public jakasMetoda(){
  }
}

Można to obejść stosując tzw. refleksję, ale zdecydowanie nie polecam tego na początek.

borovsky napisał(a)

drzewo obiektów

Nie potrzeba Ci żadne drzewo, tylko co najwyżej mapa, która mapuje nazwy kontrolerów na singletony będące tymi kontrolerami.

Jeżeli jakiś zdalny klient ma wołać metody na Twoim serwerze, to najprościej jest użyć RMI http://pl.wikipedia.org/wiki/RMI

0

otóż właśnie mi przypomniałeś - chodziło o reflection. hmm, projekt jest zbyt skomplikowany, część tylko w javie i nie bardzo mam możliwość manewru typu:

Nie potrzeba Ci żadne drzewo, tylko co najwyżej mapa, która mapuje nazwy kontrolerów na singletony będące tymi kontrolerami.

Jeżeli jakiś zdalny klient ma wołać metody na Twoim serwerze, to najprościej jest użyć RMI http://pl.wikipedia.org/wiki/RMI

sorki za niejasność moich wypowiedzi ale jestem troche wkurzony bo przez moj problem stanął mój projekt.

tylko pytanie co z tym reflection. bo ktoś na flashowym forum mi o tym powiedzial ale wymiekl bo javy dawno nie uzywal.

0

Mam propozycje - uspokoj sie, i napisz powoli, jasno i wyraznie, drukowanymi literami, co masz zrobic. Ale napisz dokladnie, bez zadnych skrotow myslowych, pelnymi zdaniami. Tylko wtedy bedziemy w stanie pomoc, nikt tu nie bedzie wiecej zgadywac. A o refleksji Koziolek napomnal w pierwszym poscie (nie uzyl tej nazwy) a ty kategorycznie odmowiles. Wiec jak do choinki jest, czego ty chcesz?

0

w as3 byłoby to proste.
sprawa wygląda tak:
ma być struktura obiektów w postaci drzewa. Nie wiadomo co ma zawierać pojedynczy obiekt. Może zawierać dane binarne, string, liczbę lub obiekty które przechowują podobiekty (czyli drzewo) - ma być to odwzorowanie dysku twardego tylko że w pamięci ram. każdy element drzewa ma swoją nazwę. program musi mieć też funkcję która zwraca obiekt po ścieżce (tak jak na dysku: C:/program files/app/file.exe)

nie mam problemu z napisaniem tego w AS3,
lecz w javie mam dwa problemy:
utworzenie obiektu w istniejącym (czyli nie deklarowanie pól w czasie kompilacji tylko w runtime) - w as3 są klasy dynamiczne.

drugi problem:
dostęp do pola danego obiektu (pole zadeklarowane w runtime) za pomocą zmiennej String:
czyli to co w as3 byłoby tak napisane:
function getObjectByName(name:String):Object
{
return this[name];
}

0

Ok... teraz jasne.
Po pierwsze w Javie możesz użyć typów generycznych. Możesz zatem zaimplementować sobie drzewo:

package eu.runelord.programmers.t140783;

import java.util.Arrays;
import java.util.HashMap;
import java.util.Map;

public class App {

	public static void main(String[] args) {
		Node<String> root = new Node<String>("root", null, "ROOT");
		Node<String> firstLvlCh1 = new Node<String>("firstLvlCh1", root,
				"FirstLvlCh1");
		Node<String> firstLvlCh2 = new Node<String>("firstLvlCh2", root,
				"FirstLvlCh2");
		Node<String> secondLvlCh21 = new Node<String>("secondLvlCh21", firstLvlCh2,
		"SecondLvlCh21");
		
		System.out.println(root.getByName("root"));
		System.out.println(root.getByName("root/firstLvlCh1"));
		System.out.println(root.getByName("root/firstLvlCh2"));
		System.out.println(root.getByName("root/firstLvlCh3")); //NULL
		System.out.println(root.getByName("root/firstLvlCh2/secondLvlCh21"));
		Node<?> node = root.getByName("root");
		System.out.println(node.getValue().getClass());
	}
}

class Node<T extends Object> {

	private String name;

	private Node parent;

	private Map<String, Node> children;

	private T value;

	private Class<T> valueClass;

	public Node(String name, Node parent, T value) {
		this.name = name;
		this.parent = parent;
		this.value = value;
		children = new HashMap<String, Node>();
		if (parent != null)
			parent.add(this);
	}

	private void add(Node<T> node) {
		this.children.put(node.name, node);
	}

	public Node getByName(String path) {
		path.replaceFirst("/", "");
		// dla null błąd
		if (path == null)
			throw new NullPointerException("Node path is NULL");

		String elements[] = path.split("/");
		if(elements.length == 1)
			return this;
		String childPath = merge(Arrays.copyOfRange(elements, 2, elements.length));
		Node child = children.get(elements[1]);
		if(child!=null){
			return child.getByName(childPath);
		}
		return null;
	}

	private String merge(String[] childrenPath) {
		String ret = "";
		for (String s : childrenPath)
			ret = ret + "/" + s;
		return ret;
	}

	@Override
	public String toString() {
		return this.value.toString();
	}

	public T getValue() {
		return value;
	}

}


w tym stylu :) Tylko przetestuj, bo to na pałę trochę pisałem.

Co do pobierania przez nazwę. Jak masz nazwę klasy to możńa za pomocą refleksji wyciągnąć nazwy pól i metod.

0

dzięki za zaangażowanie, dalej myślę sobie że sobie poradzę :)

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