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
01public static void SetCars() 02 { 03 File.Delete(YapFileName); 04 IObjectContainer db = Db4oFactory.OpenFile(YapFileName); 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(YapFileName) 03 Dim db As IObjectContainer = Db4oFactory.OpenFile(YapFileName) 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
01public static void GetReflectorInfo() 02 { 03 IObjectContainer db = Db4oFactory.OpenFile(YapFileName); 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 for (int i=0; i <knownClasses.Length; i++) 12 { 13 Console.WriteLine(knownClasses[i]); 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(YapFileName) 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 For i = 0 To knownClasses.Length - 1 Step i + 1 16 Console.WriteLine(knownClasses(i).GetName()) 17 Next 18 19 Finally 20 db.Close() 21 End Try 22 End Sub

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

ReflectorExample.cs: GetCarInfo
01public static void GetCarInfo() 02 { 03 IObjectContainer db = Db4oFactory.OpenFile(YapFileName); 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 for (int i = 0; i < fields.Length; i++) 19 Console.WriteLine(fields[i].GetName()); 20 21 // constructors 22 Console.WriteLine("CONSTRUCTORS:"); 23 IReflectConstructor[] cons = carClass.GetDeclaredConstructors(); 24 for (int i = 0; i < cons.Length; i++) 25 Console.WriteLine( cons[i]); 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(YapFileName) 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 i As Integer 16 For i = 0 To fields.Length - 1 Step i + 1 17 Console.WriteLine(fields(i).GetName()) 18 Next 19 20 ' constructors 21 Console.WriteLine("CONSTRUCTORS:") 22 Dim cons() As IReflectConstructor = carClass.GetDeclaredConstructors() 23 For i = 0 To cons.Length - 1 Step i + 1 24 Console.WriteLine(cons(i)) 25 Next 26 27 ' public methods 28 Console.WriteLine("METHODS:") 29 Dim params As IReflectClass() = {} 30 Dim method As IReflectMethod = carClass.GetMethod("ToString", params) 31 Console.WriteLine("ToString method " + CType(method, Object).ToString()) 32 Finally 33 db.Close() 34 End Try 35 End Sub

We can use classes retrieved using reflection to create queries:

ReflectorExample.cs: GetCars
01public static void GetCars() 02 { 03 IObjectContainer db = Db4oFactory.OpenFile(YapFileName); 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(YapFileName) 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