java如何使用反射来获取某一个类的全部信息

反射是Java的一大特性,可以通过反射来获取某一个类的全部域、构造方法和成员方法。


原理介绍

  • 在java.lang.reflect包中有三个类Field、Method、Constructor分别用于描述类的域、方法和构造器。
  • 这三个类都有一个叫做getName的方法,用来返回项目的名称
  • Field类有一个getType方法,用来返回描述域所属的Class对象
  • Method和Constructor类有一个getParameterTypes方法,返回参数类型的Class对象数组
  • 这三个类都有一个getModifiers方法,它返回一个整型数值,用不同的位开关描述public和static这样的修饰符使用情况,并用Modifiers类中toString方法将修饰符打印出来
  • Class类中的getFields、getMethods、getConstructors方法将分别返回类提供的public域、方法和构造方法数组,其中包括父类的公有成员
  • Class类的getDeclareFields、getDeclareMethods和getDeclaredConstructors方法将返回类中生命的全部域、方法和构造方法数组,其中包括私有成员和受保护成员,但不包括父类的成员

代码示例

import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.lang.reflect.Modifier;
import java.util.Scanner;

public class ReflectionTest {
	public static void main(String[] args) {
		String name;
		if (args.length > 0) name = args[0];
		else {
			Scanner in = new Scanner(System.in);
			System.out.print("Enter Class name (e.g java.util.Date):");
			name = in.next();
		}
		try {
			Class cl = Class.forName(name);
			Class supercl = cl.getSuperclass();
			String modifiers = Modifier.toString(cl.getModifiers());
			if (modifiers.length() > 0 )System.out.print(modifiers + " ");
			System.out.print("class "+name);
			if (supercl != null && supercl != Object.class) {
				System.out.print("extends "+supercl.getName());
			}
			System.out.print("\n{\n");
		
			printFields(cl);
			System.out.println();
			printConstructors(cl);
			System.out.println();
			printMethods(cl);
			System.out.print("}\n");
			
		} catch (Exception e) {
			// TODO: handle exception
		}
	}
	public static void printConstructors(Class cl) {
		Constructor[] constructors = cl.getConstructors();
		for (Constructor c:constructors) {
			System.out.print("  ");
			String name = c.getName();
			String modifiers = Modifier.toString(c.getModifiers());
			if (modifiers.length() > 0 )System.out.print(modifiers + " ");
			System.out.print(name+" (");
			Class[] paramType = c.getParameterTypes();
			for (int j = 0; j < paramType.length; j++) {
				if (j > 0) System.out.print(", ");
				System.out.print(paramType[j].getName());
			}
			System.out.print(")");
		}
		System.out.println();
	}
	public static void printMethods(Class cl) {
		Method[] methods = cl.getDeclaredMethods(); 
		for (Method m:methods) {
			System.out.print("  ");
			String name = m.getName();
			String modifiers = Modifier.toString(m.getModifiers());
			if(modifiers.length()>0) System.out.print(modifiers+" ");
			Class returnType =m.getReturnType();
			System.out.print(returnType.getName()+" ");
			System.out.print(name+" (");
			Class[] paramType = m.getParameterTypes();
			for (int j = 0; j < paramType.length; j++) {
				if (j > 0) System.out.print(", ");
				System.out.print(paramType[j].getName());
			}
			System.out.print(")");
			System.out.println();
		}
		System.out.println();
	}
	public static void printFields(Class cl) {
		Field[] fields = cl.getDeclaredFields();
		for (Field f:fields) {
			System.out.print("  ");
			String name = f.getName();
			Class type = f.getType();
			String modifiers = Modifier.toString(f.getModifiers());
			if(modifiers.length()>0) System.out.print(modifiers+" ");
			System.out.println(type.getName()+" "+name+";");
		}
	}
}

你可能感兴趣的:(java,反射)