JVM在真正使用一个类的时候才加载这个类的.class文件。除了使用时加载类外,也可以使用Class.forName( classNameWithPackage )来完成类加载。
Class对象表示所加载的类,取得Class对象后,可获得与类相关的信息,如包、构造函数、方法成员、域成员等信息,类的每种构成对应的类型如下:
包 | java.lang.Package |
构造函数 | java.lang.reflect.Constructor |
方法 | java.lang.reflect.Method |
域成员 | java.lang.reflect.Field |
修饰词 | java.lang.reflect.Modifier |
以下例子用于获取类的信息SimpleClassViewer.java
package com.xiaofan.demo.reflect; import java.lang.reflect.Constructor; import java.lang.reflect.Field; import java.lang.reflect.Method; import java.lang.reflect.Modifier; public class SimpleClassViewer { /** * @param args */ public static void main(String[] args) { // TODO Auto-generated method stub String className = "java.util.ArrayList"; new SimpleClassViewer().viewClass( className ); } public void viewClass( String className ){ try { Class c = Class.forName(className); StringBuffer buffer = new StringBuffer(); //包信息 Package pkg = c.getPackage(); buffer.append( "package " + pkg.getName() + ";").append("\n"); //取得类修饰 int m = c.getModifiers(); buffer.append( Modifier.toString( m ) + " " ); if( c.isInterface() ){ buffer.append("interface "); } else{ buffer.append("class "); } buffer.append( c.getName() + " {" ).append("\n"); //取得声明的域成员 Field[] fields = c.getDeclaredFields(); for(Field field : fields ){ buffer.append("\t") .append( Modifier.toString( field.getModifiers() ) ) .append(" ") .append( field.getType().getName() ) .append(" ") .append( field.getName() ) .append(";") .append("\n"); } buffer.append("\n"); //取得构造器 Constructor[] constructors = c.getDeclaredConstructors(); for( Constructor constructor : constructors ){ buffer.append("\t") .append( Modifier.toString( constructor.getModifiers() )).append(" ") .append( constructor.getName() ).append("("); // .append( constructor.getParameterTypes() ) Class[] params = constructor.getParameterTypes(); if( params.length > 0 ){ buffer.append( params[0].getName()).append(" arg0"); for( int i=1; i<params.length; i++ ){ buffer.append(", ").append( params[i].getName() ).append(" arg" + i); } } buffer.append(");"); buffer.append("\n"); } buffer.append("\n"); //取得声明的方法 Method[] methods = c.getDeclaredMethods(); for(Method method : methods ){ buffer.append("\t") .append( Modifier.toString( method.getModifiers() )).append(" ") .append( method.getReturnType().getName() ) .append(" ") .append( method.getName() ) .append("("); Class[] params = method.getParameterTypes(); if( params.length > 0 ){ buffer.append( params[0].getName()).append(" arg0"); for( int i=1; i<params.length; i++ ){ buffer.append(", ").append( params[i].getName() ).append(" arg" + i); } } buffer.append(");"); buffer.append("\n"); } System.out.println( buffer.toString() ); } catch (ClassNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } } }
运行输出结果如下: