KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > com > db4o > test > reflect > Reflection


1 /* Copyright (C) 2004 - 2006 db4objects Inc. http://www.db4o.com
2
3 This file is part of the db4o open source object database.
4
5 db4o is free software; you can redistribute it and/or modify it under
6 the terms of version 2 of the GNU General Public License as published
7 by the Free Software Foundation and as clarified by db4objects' GPL
8 interpretation policy, available at
9 http://www.db4o.com/about/company/legalpolicies/gplinterpretation/
10 Alternatively you can write to db4objects, Inc., 1900 S Norfolk Street,
11 Suite 350, San Mateo, CA 94403, USA.
12
13 db4o is distributed in the hope that it will be useful, but WITHOUT ANY
14 WARRANTY; without even the implied warranty of MERCHANTABILITY or
15 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
16 for more details.
17
18 You should have received a copy of the GNU General Public License along
19 with this program; if not, write to the Free Software Foundation, Inc.,
20 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */

21 package com.db4o.test.reflect;
22
23 import com.db4o.reflect.*;
24 import com.db4o.reflect.generic.*;
25 import com.db4o.reflect.jdk.*;
26
27 /**
28  * test for custom reflection implementations.
29  * <br><br>
30  * db4o internally uses java.lang.reflect.* by default. On platforms that
31  * do not support this package, customized implementations may be written
32  * to supply all the functionality of the interfaces in the com.db4o.reflect
33  * package. The sources in this sample packages demonstrate, how db4o
34  * accesses the java.lang.reflect.* functionality.
35  * <br><br>
36  * This TestReflect method may be used to test, if you own implementation
37  * provides the functionality that db4o needs. You may call the test from
38  * the command line by specifying the classname of your own class that
39  * implements IReflect. Alternatively you can call the test(IReflect) method.
40  */

41 public class Reflection extends Test {
42
43     private final Reflector _reflector;
44     private final ReflectClass _classReflector;
45
46     public Reflection() throws ClassNotFoundException JavaDoc {
47         this(new GenericReflector(null, new JdkReflector(Thread.currentThread().getContextClassLoader())));
48     }
49
50     public Reflection(Reflector reflector) {
51         _reflector = reflector;
52         _classReflector = _reflector.forName(TestReflectClass.class.getName());
53     }
54     
55     public void testIClass() throws ClassNotFoundException JavaDoc {
56         ReflectField[] fields = _classReflector.getDeclaredFields();
57         _assert(
58             fields.length == TestReflectClass.FIELD_COUNT, "getDeclaredFields method failed.");
59         for (int i = 0; i < fields.length; i++) {
60             _assert(fields != null, "getDeclaredFields[" + i + "] is valid");
61             String JavaDoc fieldName = fields[i].getName();
62             ReflectField fieldReflector = _classReflector.getDeclaredField(fieldName);
63             _assert(
64                 fieldReflector != null,
65                 "getDeclaredField('" + fieldName + "') is valid");
66         }
67
68         tstIField();
69
70         ReflectClass abstractReflector =
71             _reflector.forName(TestReflectAbstractClass.class.getName());
72         _assert(abstractReflector.isAbstract(), "isAbstract");
73         ReflectClass interfaceReflector =
74             _reflector.forName(TestReflectInterface.class.getName());
75         _assert(interfaceReflector.isInterface(), "isInterface");
76         Object JavaDoc instance = _classReflector.newInstance();
77         _assert(instance != null, "newInstance");
78
79     }
80
81     private void tstIField() {
82         tstIField1("myString", "HiBabe", String JavaDoc.class);
83         tstIField1("myInt", new Integer JavaDoc(10), int.class);
84         tstIField1("myTyped", new TestReflectClass(), TestReflectClass.class);
85         tstIField1("myUntyped", "Foooo", Object JavaDoc.class);
86         tstIField1("myUntyped", new TestReflectClass(), Object JavaDoc.class);
87         _assert(
88             _classReflector.getDeclaredField("myStatic").isStatic(),
89             "IField.isStatic()");
90         _assert(
91             _classReflector.getDeclaredField("myTransient").isTransient(),
92             "IField.isTransient()");
93     }
94
95     private void tstIField1(String JavaDoc fieldName, Object JavaDoc obj, Class JavaDoc clazz) {
96         ReflectClass claxx = _reflector.forClass(clazz);
97         String JavaDoc fieldMessage =
98             TestReflectClass.class.getName() + ":" + fieldName;
99         TestReflectClass onObject = new TestReflectClass();
100         ReflectField fieldReflector = _classReflector.getDeclaredField(fieldName);
101         fieldReflector.set(onObject, obj);
102         Object JavaDoc got = fieldReflector.get(onObject);
103         _assert(got != null, fieldMessage + " IField.get returns NULL");
104         _assert(
105             obj.equals(got),
106             fieldMessage + " IField.get returns strange Object");
107         _assert(
108             fieldReflector.getName().equals(fieldName),
109             "IField.getName()");
110         _assert(fieldReflector.isPublic(), "IField.isPublic()");
111         _assert(!fieldReflector.isStatic(), "IField.isStatic()");
112         _assert(!fieldReflector.isTransient(), "IField.isTransient()");
113         _assert(fieldReflector.getFieldType().equals(claxx), "IField.getType()");
114     }
115
116     public void testIArray() {
117         tstIArray1(new Object JavaDoc[] {"", "hi", "Cool"});
118         tstIArray1(new Object JavaDoc[] {new Object JavaDoc(), new TestReflectClass(), "Woooa", new Integer JavaDoc(3)});
119         tstIArray1(new Object JavaDoc[] {new TestReflectClass(),new TestReflectClass()});
120         tstIArray2(new int[] {1,2,3});
121         tstIArray2(new long[] {1L,2L,3L});
122     }
123     
124     public void tstEverything() throws ClassNotFoundException JavaDoc {
125         testIClass();
126         testIArray();
127     }
128
129     private void tstIArray1(Object JavaDoc[] elements){
130         ReflectArray array = _reflector.array();
131         ReflectClass clazz = _reflector.forObject(elements[0]);
132         Object JavaDoc obj = array.newInstance(clazz,0);
133         _assert(obj != null, "Creation of zero length array");
134         _assert(array.getLength(obj) == 0, "Zero length array length");
135         obj = array.newInstance(clazz, elements.length);
136         _assert(obj != null, "Creation of variable length array");
137         _assert(array.getLength(obj) == elements.length, "Variable length array length");
138         for (int i = 0; i < elements.length; i++) {
139             array.set(obj, i, elements[i]);
140         }
141         for (int i = 0; i < elements.length; i++) {
142             _assert(elements[i].equals(array.get(obj, i)), "Array element comparison");
143         }
144     }
145     
146     private void tstIArray2(Object JavaDoc arr){
147         ReflectArray array = _reflector.array();
148         Object JavaDoc element = array.get(arr, 0);
149         ReflectClass clazz = _reflector.forObject(element);
150         Object JavaDoc obj = array.newInstance(clazz,0);
151         _assert(obj != null, "Creation of zero length array");
152         _assert(array.getLength(obj) == 0, "Zero length array length");
153         int length = array.getLength(arr);
154         obj = array.newInstance(clazz, length);
155         _assert(obj != null, "Creation of variable length array");
156         _assert(array.getLength(obj) == length, "Variable length array length");
157         for (int i = 0; i < length; i++) {
158             array.set(obj, i, array.get(arr,i));
159         }
160         for (int i = 0; i < length; i++) {
161             _assert(array.get(arr,i).equals(array.get(obj, i)), "Array element comparison");
162         }
163     }
164 }
165
Popular Tags