Voglio possibilmente usare Java Reflection per impostare alcuni dati su RunTime. Il mio problema è che non riesco a capire come posso ottenere informazioni sulle sottoclassi e utilizzare come parte della riflessione.
Voglio usare Reflection per mantenerlo generico per una flessibilità futura.
Struttura Java - Classe e amp; Campi (tipo di dati di campo tra parentesi) che seguono nei punti elenco. Sono presenti metodi Setter / Getter per ogni campo. Questa è una rappresentazione di esempio.
Restaurant
- RestaurantId (long)
- RestaurantName (String)
- RestaurantCity (String)
- Employee (Employee object)
- Menu (Menu object)
Employee
- EmployeeId (long)
- EmployeeName (String)
Menu
- MenuId (long)
- MenuItem (String)
- MenuCategory (String)
- MenuIngredients (Ingredients object)
Ingredients
- IngredientId (long)
- IngredientName (String)
Come possiamo vedere, ho più livelli di struttura degli oggetti. Quindi Restaurant
come l'oggetto più in alto, quindi entro Restaurant
c'è l'oggetto di Employee
e Menu
e all'interno di Menu
oggetto c'è un oggetto Ingredients
.
Requisiti
Riceverò il nome e il campo della classe (nome del metodo) per impostare il valore. Per esempio. Otterrò qualcosa come Class = Restaurant & Field Method = setRestaurantCity
e valore da impostare in Città. Potrei anche ottenere Class = Menu & Field Method = setMenuItem
o diciamo Class = Ingredients & Field Method = setIngredientName
e rispettivi valori per loro.
Ho fornito un codice java di esempio con il quale sto provando a testare. Come abbiamo potuto vedere nel codice java che funziona bene per l'impostazione del valore in Restaurant
oggetto. Tuttavia mi piacerebbe impostare i dati in un altro oggetto che in realtà è di due livelli fino a Restaurant
, cioè R estaurant --> Menu --> Ingredients
. per valueObject2
.
Non voglio usare instanceOf
in quanto avrebbe bisogno di me per verificare ogni singolo oggetto. Dato che la struttura corrente non è solo di 2 livelli ma molto più profonda, qualcosa come andare su fino a 5 livelli con oggetti di classe totale contando fino a 25 di essi.
Sto cercando una soluzione in cui posso abbinare i nomi della classe e impostare i rispettivi valori. Quindi, se ottengo valueObject3
e Respetive Class & Il campo viene inviato in futuro, quindi la soluzione dovrebbe funzionare.
Aperto per qualsiasi altra soluzione oltre a Reflection
Codice Java
public static void main(String[] args) {
try {
Object valueObject1 = "Mumbai";
String fromClass1 = "com.test.Restaurant";
String fromMethod1 = "setRestaurantCity";
Object valueObject2 = "Bread";
String fromClass2 = "com.test.Ingredients";
String fromMethod2 = "setIngredientName";
Object restnt = new Restaurant();
Class<? extends Object> clsRestnt = restnt.getClass();
System.out.println(clsRestnt.getCanonicalName());
Method[] toRestMethods = clsRestnt.getMethods();
for (int i = 0; i<toRestMethods.length; i++)
{
System.out.println(toRestMethods[i].getName());
if(toRestMethods[i].getName().equalsIgnoreCase(fromMethod1))
{
System.out.println("Found Method " + toRestMethods[i]);
valueObject1 = toRestMethods[i].invoke(restnt, valueObject1);
}
}
} catch (ClassNotFoundException | IllegalAccessException | IllegalArgumentException | InvocationTargetException | InstantiationException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}