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