I'm not sure what is going on with what I'm doing, so thought I'd ask for some help. My environment is Sun JDK 1.3. I am trying to understand reflection. When I run the command 'java com.bascom.TestClass3' from a terminal, I get this output (I'm only pasteing in the pertanent part): [treaves@double treaves]$ java com.bascom.TestClass3 4 Fields for TestClass3 ===================== Field 0: private int com.bascom.TestClass3.attribute3 Field 1: private java.util.HashMap com.bascom.TestClass3.hasmMapAttribute Field 2: private java.lang.String com.bascom.TestClass3.lastAttribute Field 3: private static java.lang.Class com.bascom.TestClass3.class$Ljava$lang$Object This is what I get from BeanShell: bsh % Class testClass = Class.forName("com.bascom.TestClass3"); bsh % Field[] fields = testClass.getDeclaredFields(); bsh % print(fields.length); 3 bsh % print(fields); Array: [Ljava.lang.reflect.Field;@6f247 { private int com.bascom.TestClass3.attribute3 private java.util.HashMap com.bascom.TestClass3.hasmMapAttribute private java.lang.String com.bascom.TestClass3.lastAttribute } So when I run from the commandline, it lists that there are four fields, and in BeanShell it lists three. The command line shows the java.lang.Class as the fourth field. Why? What am I missing? Thanks.
package com.bascom; public class TestClass1 { private int attribute1; protected String rootAttribute; public int getAttribute1(){ return attribute1; } public void setAttribute1(int attribute1){ this.attribute1 = attribute1; } public String getRootAttribute(){ return rootAttribute; } public void setRootAttribute(String rootAttribute){ this.rootAttribute = rootAttribute; } private void operation1() { } }
package com.bascom; public class TestClass2 extends TestClass1 { private int attribute2; private boolean boolAttribute; public float staticAttribute; public boolean isBoolAttribute(){ return boolAttribute; } public void setBoolAttribute(boolean boolAttribute){ this.boolAttribute = boolAttribute; } }
package com.bascom; import java.lang.reflect.*; import java.util.ArrayList; import java.util.Arrays; import java.util.HashMap; import java.util.Iterator; public class TestClass3 extends TestClass2 { private int attribute3; private HashMap hasmMapAttribute; private String lastAttribute; public static void main(String[] args){ try{ Class testClass = Class.forName("com.bascom.TestClass3"); Field[] fields = testClass.getDeclaredFields(); System.out.println(fields.length); ArrayList list = new ArrayList(); list.addAll(Arrays.asList(testClass.getDeclaredFields())); Class superClass = testClass.getSuperclass(); do { list.addAll(Arrays.asList(superClass.getDeclaredFields())); } while ( (superClass = superClass.getSuperclass()) != null && superClass != Object.class ); int index = 0; System.out.println("Fields for TestClass3"); System.out.println("====================="); for (;index < fields.length; index++) { System.out.println("Field " + index + ": " + fields[index]); } System.out.println("Fields for TestClass3 + superclasses"); System.out.println("===================================="); Iterator it = list.iterator(); index = 0; while (it.hasNext()) { System.out.println("Field " + index++ + ": " + it.next().toString()); } } catch(Exception e){ e.printStackTrace(); } } }