Using db4o reflection API

Db4o reflector can be used in your application just like normal java reflector. Let's create a new database with a couple of cars in it:

ReflectorExample.cs: SetCars
01private static void SetCars() 02 { 03 File.Delete(Db4oFileName); 04 IObjectContainer db = Db4oFactory.OpenFile(Db4oFileName); 05 try 06 { 07 Car car1 = new Car("BMW"); 08 db.Set(car1); 09 Car car2 = new Car("Ferrari"); 10 db.Set(car2); 11 12 Console.WriteLine("Saved:"); 13 IQuery query = db.Query(); 14 query.Constrain(typeof(Car)); 15 IObjectSet results = query.Execute(); 16 ListResult(results); 17 } 18 finally 19 { 20 db.Close(); 21 } 22 }
ReflectorExample.vb: SetCars
01Public Shared Sub SetCars() 02 File.Delete(Db4oFileName) 03 Dim db As IObjectContainer = Db4oFactory.OpenFile(Db4oFileName) 04 Try 05 Dim car1 As Car = New Car("BMW") 06 db.Set(car1) 07 Dim car2 As Car = New Car("Ferrari") 08 db.Set(car2) 09 10 Console.WriteLine("Saved:") 11 Dim query As IQuery = db.Query() 12 query.Constrain(GetType(Car)) 13 Dim results As IObjectSet = query.Execute() 14 ListResult(results) 15 Finally 16 db.Close() 17 End Try 18 End Sub

We can check, what information is available for db4o reflector:

ReflectorExample.cs: GetReflectorInfo
01private static void GetReflectorInfo() 02 { 03 IObjectContainer db = Db4oFactory.OpenFile(Db4oFileName); 04 try 05 { 06 Console.WriteLine("Reflector in use: " + db.Ext().Reflector()); 07 Console.WriteLine("Reflector delegate" +db.Ext().Reflector().GetDelegate()); 08 IReflectClass[] knownClasses = db.Ext().Reflector().KnownClasses(); 09 int count = knownClasses.Length; 10 Console.WriteLine("Known classes: " + count); 11 foreach (IReflectClass knownClass in knownClasses) 12 { 13 Console.WriteLine(knownClass); 14 } 15 } 16 finally 17 { 18 db.Close(); 19 } 20 }
ReflectorExample.vb: GetReflectorInfo
01Public Shared Sub GetReflectorInfo() 02 03 Dim db As IObjectContainer = Db4oFactory.OpenFile(Db4oFileName) 04 Try 05 Dim ref As IReflector 06 ref = db.Ext().Reflector() 07 Console.WriteLine("Reflector in use: " + CType(ref, Object).ToString()) 08 Console.WriteLine("Reflector delegate" + CType(db.Ext().Reflector().GetDelegate(), Object).ToString()) 09 Dim knownClasses As IReflectClass() 10 knownClasses = db.Ext().Reflector().KnownClasses() 11 Dim count As Integer 12 count = knownClasses.Length 13 Console.WriteLine("Known classes: " + count.ToString()) 14 Dim i As Integer 15 Dim knownClass As IReflectClass 16 For Each knownClass In knownClasses 17 Console.WriteLine(knownClass.GetName()) 18 Next 19 20 Finally 21 db.Close() 22 End Try 23 End Sub

All the information about Car class can also be retrieved through reflector:

ReflectorExample.cs: GetCarInfo
01private static void GetCarInfo() 02 { 03 IObjectContainer db = Db4oFactory.OpenFile(Db4oFileName); 04 try 05 { 06 IObjectSet result = db.Get(new Car("BMW")); 07 if (result.Size() < 1) 08 { 09 return; 10 } 11 Car car = (Car)result[0]; 12 GenericReflector reflector = new GenericReflector(null,db.Ext().Reflector()); 13 IReflectClass carClass = reflector.ForObject(car); 14 Console.WriteLine("Reflected class "+carClass); 15 // public fields 16 Console.WriteLine("FIELDS:"); 17 IReflectField[] fields = carClass.GetDeclaredFields(); 18 foreach (IReflectField field in fields) 19 Console.WriteLine(field.GetName()); 20 21 // constructors 22 Console.WriteLine("CONSTRUCTORS:"); 23 IReflectConstructor[] cons = carClass.GetDeclaredConstructors(); 24 foreach (IReflectConstructor constructor in cons) 25 Console.WriteLine(constructor); 26 27 // public methods 28 Console.WriteLine("METHODS:"); 29 IReflectMethod method = carClass.GetMethod("ToString", new IReflectClass[] { }); 30 if (method != null) 31 { 32 Console.WriteLine(method.GetType()); 33 } 34 35 } 36 finally 37 { 38 db.Close(); 39 } 40 }
ReflectorExample.vb: GetCarInfo
01Public Shared Sub GetCarInfo() 02 Dim db As IObjectContainer = Db4oFactory.OpenFile(Db4oFileName) 03 Try 04 Dim result As IObjectSet = db.Get(New Car("BMW")) 05 If result.Size() < 1 Then 06 Return 07 End If 08 Dim car As Car = CType(result(0), Car) 09 Dim reflector As GenericReflector = New GenericReflector(Nothing, db.Ext().Reflector()) 10 Dim carClass As IReflectClass = reflector.ForObject(car) 11 Console.WriteLine("Reflected class " + carClass.GetName()) 12 ' public fields 13 Console.WriteLine("FIELDS:") 14 Dim fields() As IReflectField = carClass.GetDeclaredFields() 15 Dim field As IReflectField 16 For Each field In fields 17 Console.WriteLine(field.GetName()) 18 Next 19 20 ' constructors 21 Console.WriteLine("CONSTRUCTORS:") 22 Dim cons() As IReflectConstructor = carClass.GetDeclaredConstructors() 23 Dim constructor As IReflectConstructor 24 For Each constructor In cons 25 Console.WriteLine(constructor) 26 Next 27 28 ' public methods 29 Console.WriteLine("METHODS:") 30 Dim params As IReflectClass() = {} 31 Dim method As IReflectMethod = carClass.GetMethod("ToString", params) 32 Console.WriteLine("ToString method " + CType(method, Object).ToString()) 33 Finally 34 db.Close() 35 End Try 36 End Sub

[/filter]

We can use classes retrieved using reflection to create queries:

[filter=java]

ReflectorExample.java: getCars
01private static void getCars() 02 { 03 ObjectContainer container=Db4o.openFile(DB4O_FILE_NAME); 04 try { 05 GenericReflector reflector = new GenericReflector(null,container.ext().reflector()); 06 ReflectClass carClass = reflector.forName(Car.class.getName()); 07 System.out.println("Reflected class "+carClass); 08 System.out.println("Retrieved with reflector:"); 09 Query query = container.query(); 10 query.constrain(carClass); 11 ObjectSet results = query.execute(); 12 listResult(results); 13 } finally { 14 container.close(); 15 } 16 }
ReflectorExample.cs: GetCars
01private static void GetCars() 02 { 03 IObjectContainer db = Db4oFactory.OpenFile(Db4oFileName); 04 try 05 { 06 IQuery query = db.Query(); 07 query.Constrain(typeof(Car)); 08 IObjectSet result = query.Execute(); 09 ListResult(result); 10 Car car = (Car)result[0]; 11 GenericReflector reflector = new GenericReflector(null,db.Ext().Reflector()); 12 IReflectClass carClass = reflector.ForObject(car); 13 Console.WriteLine("Reflected class "+carClass); 14 Console.WriteLine("Retrieved with reflector:"); 15 } 16 finally 17 { 18 db.Close(); 19 } 20 }
ReflectorExample.vb: GetCars
01Public Shared Sub GetCars() 02 Dim db As IObjectContainer = Db4oFactory.OpenFile(Db4oFileName) 03 Try 04 Dim query As IQuery = db.Query() 05 query.Constrain(GetType(Car)) 06 Dim result As IObjectSet = query.Execute() 07 ListResult(result) 08 Dim car As Car = CType(result(0), Car) 09 Dim reflector As GenericReflector = New GenericReflector(Nothing, db.Ext().Reflector()) 10 Dim carClass As IReflectClass = reflector.ForObject(car) 11 Console.WriteLine("Reflected class " + carClass.GetName()) 12 Finally 13 db.Close() 14 End Try 15 End Sub