Ich versuche eine Java-Methode zu schreiben, die Assoziationen von einer bestimmten Klasse zu einer anderen Klasse entdeckt. Wie kann ich die Assoziation und die einer bestimmten Klasse zugeordneten Klassen finden?Wie ist die Assoziation in Java implementiert?
Antwort
Dies ist möglicherweise eine sehr komplexe Frage, Sie sollten Ihre Frage wirklich bearbeiten, um mehr Details darüber zu erhalten, was Sie versuchen zu tun. Ich werde versuchen zu erklären, warum das schwieriger ist als du denkst, während du gleichzeitig etwas bereitstellst, das gut genug ist, um das zu erreichen, was du willst.
Mein Verständnis ist, dass Sie eine Java-Methode schreiben möchten, die "Assoziationen" von einer bestimmten Klasse zu anderen Klassen entdeckt, und dass "Assoziationen" bedeutet "hat-a" Beziehungen.
Hinweis: für die Zwecke des Beispielcodes ich die Paketnamen „reflect.findHasARelation“
So lassen Sie sich das folgende Szenario verwenden:
Es gibt eine Car
Klasse, die eine erklärt einige Felder:
package reflect.findHasARelation;
public class Car {
private Motor motor;
private int weight;
private FuelTank fuelTank;
}
und wir haben auch die Klassen Motor
und FuelTank
im gleichen Paket. Zur Vereinfachung tun sie nichts.
Motorklasse:
package reflect.findHasARelation;
public class Motor {}
FuelTank Klasse:
package reflect.findHasARelation;
public class FuelTank {}
Lassen Sie uns jetzt einige Code schreiben, der die Car
Klasse analysiert:
package reflect.findHasARelation;
import java.lang.reflect.Field;
public class FindHasARelationMain {
public static void main(String[] args) {
//It's not clear to me how you need to identify which classes to analyze
// so for now this is just hardcoded for the purposes of this example.
analyzeClass(Car.class);
}
public static void analyzeClass(Class classToAnalyze){
//Process all fields of the class
for(Field field: classToAnalyze.getDeclaredFields()){
if(Object.class.isAssignableFrom(field.getType())){
//Assuming you're only interested in non-primitive fields
// this condition would tell you that the class you're
// analyzing is in a "has-a" relationship with whatever
// class the field is defined with.
System.out.println("Class "+classToAnalyze.getName()+" has a field "
+ field.getName() + " of type "+ field.getType().getName());
}else{
System.out.println("Class "+classToAnalyze.getName()+" has a primitive field "
+ field.getName() + " of type "+ field.getType().getName());
}
}
}
}
Wenn Sie die oben Klasse ausgeführt werden Sie Siehe Ausgabe wie folgt:
Class reflect.findHasARelation.Car has a field motor of type reflect.findHasARelation.Motor
Class reflect.findHasARelation.Car has a primitive field weight of type int
Class reflect.findHasARelation.Car has a field fuelTank of type reflect.findHasARelation.FuelTank
Sieht bis jetzt ziemlich gut aus, nicht wahr? Wir können sehen, dass es in der Lage ist zu identifizieren, dass die Car
Klasse in einer "has-a" -Beziehung sowohl mit Motor
als auch FuelTank
ist.
Hier kommt die Komplexität ins Spiel: Was ist, wenn der Typ eines Feldes eine Schnittstelle statt einer Klasse ist?
Beginnen wir durch eine Schnittstelle zu erstellen:
package reflect.findHasARelation;
public interface Engine {
public void start();
}
Nun wollen wir eine neue Art von Auto erstellen:
package reflect.findHasARelation;
public class StandardCar {
//Declares a field using an interface as the type
private Engine engine;
private int weight;
private FuelTank fuelTank;
public StandardCar(){
engine = new StandardEngine();
}
}
Wenn wir die main
Methode aus früheren nehmen und ersetzen Car.class
mit StandardCar.class
dann wir sehe diesen Ausgang:
Class reflect.findHasARelation.StandardCar has a field engine of type reflect.findHasARelation.Engine
Class reflect.findHasARelation.StandardCar has a primitive field weight of type int
Class reflect.findHasARelation.StandardCar has a field fuelTank of type reflect.findHasARelation.FuelTank
Warum passiert das? Dies liegt daran, dass es beim Analysieren der Klassendefinition durch reflection nicht möglich ist zu wissen, welche Implementierung von Engine
zur Laufzeit verwendet wird.Stattdessen können Sie nur herausfinden, dass es ein Engine
von einer Art ist - bis eine Instanz der Klasse tatsächlich erstellt wird, ist nicht bekannt, welche spezielle Art von Engine
es ist. Es könnte sogar zwischen Instanzen variieren, da wir die Engine zu einem Parameter machen und ihn dann in den Konstruktor oder eine Setter-Methode übergeben könnten. In diesem Fall könnte ich zwei Instanzen der gleichen Klasse haben, die intern verschiedene Arten von Engine
Implementierungen haben.
Hoffentlich verstehen Sie jetzt, warum Ihre Frage möglicherweise viel komplexer ist, als Sie dachten.
Danke, das war wirklich hilfreich. Eigentlich analysiere ich Code-Gerüche und Anti-Patterns. Einige Anti-Muster wie Blob sind durch ihre Assoziationen mit Datenklassen gekennzeichnet. und das interessiert mich. –
Interessante Idee! Ich hoffe, dass einige meiner Antworten hilfreich sind, um Sie voranzubringen. Viel Glück! –
- 1. Wie ist die getClass() in Java implementiert?
- 2. java einfache Assoziation
- 3. Wie ist die Aufgabenplanung implementiert?
- 4. Wie wird die Java # intern() Methode implementiert?
- 5. Wie implementiert man die Java-vergleichbare Schnittstelle?
- 6. Wer implementiert die OS-Schnittstelle in Java?
- 7. Wie generisches Objekt in Java implementiert wird, implementiert eine Schnittstelle
- 8. Wie implementiert Java innere Klassenschließungen?
- 9. Wie ist die RocksDB Open-Funktion implementiert?
- 10. Wie die Funktion numpy.cov() implementiert ist?
- 11. Wie ermittelt man, ob die Rails-Assoziation geladen ist?
- 12. Wie wird dynamisches Binding in Java implementiert?
- 13. Wie implementiert man Java-Schnittstellen in Frege?
- 14. Wie man optische Elemente in Java implementiert
- 15. Verschlüsselungsmethode, die für PHP und Java implementiert ist?
- 16. Wie ist HttpSession implementiert?
- 17. Wie implementiert man 3Sum in Java?
- 18. Wie ist BigDecimal implementiert?
- 19. Wie implementiert man negative Indizes in Java?
- 20. Wie implementiert man Java-Methoden in Nativescript?
- 21. Wie implementiert man ein TreeSet in Java?
- 22. Wie OpenID in Java implementiert wird
- 23. Wie implementiert man saxon OutputURIResolver in Java?
- 24. Wie implementiert man etwas Ähnliches wie die @Override Java Annotation?
- 25. Wie implementiert man die Suchfunktion für eine ListView, die in ListFragment implementiert ist?
- 26. Wie wird das gleichzeitige Lesen in eine Datei implementiert, die dem Speicher in Java zugeordnet ist?
- 27. Ist die "Lifetime" -Restriktion in C++ implementiert?
- 28. Wie diese Assoziation in Rails
- 29. Wie funktioniert die polymorphe Assoziation mit Ecto?
- 30. Java 7: Wie implementiert man Drag & Drop in Java?
Bitte definieren Sie "association" – alfasin
Assoziation in oop stellen Sie die Beziehung zwischen zwei Klassen mithilfe ihrer Objekte her. Assoziationsbeziehung kann Eins zu Eins sein, Eins zu Viele, Viele zu Eins und Viele zu Vielen. Nehmen wir zum Beispiel an, wir hätten zwei Klassen, dann werden diese zwei Klassen als "has-a" -Beziehung bezeichnet, wenn diese beiden Entitäten das Objekt des jeweils anderen für eine bestimmte Arbeit teilen und gleichzeitig ohne gegenseitige Abhängigkeiten existieren können oder beide ihre eigenen haben Lebenszeit. –
Eigenschaften ist, was Sie suchen – Vivick