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:
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
}
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:
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
}
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:
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
}
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:
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
}
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