利用反射分析一个类的全部信息的方法

package com.zhy.reflect;

import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.lang.reflect.Modifier;
import java.util.Scanner;
/**
 * 利用反射输出一个全部信息的方法
 * 该程序提示输入类名,并依次打印出类名对应类的构造方法,其他方法,属性域等信息
 * 2018/7/8
 * @author zhy
 *
 */
public class Reflection {
	public static void main(String[] args) throws ClassNotFoundException {
		Scanner scan = new Scanner(System.in);
		String name;
		//输入类名
		System.out.println("enter class name like(eg  java.util.Date)");
		name = scan.next();
		//加载Class对象
		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);
		
		//若该类有父类且父类不是Object类那么打印出相关继承信息
		if(superCl != null && superCl != Object.class){
			System.out.print(" extends " + superCl.getName());
		}
		System.out.println("{");
		//调用打印构造函数的方法
		printConstructors(cl);
		//调用打印其他方法的方法
		printMethods(cl);
		//调用打印属性信息的方法
		printFields(cl);
		System.out.println("}");
		
	}
	//输出构造方法的方法
	public   static void  printConstructors(Class cl){
		
		//获得包括该类所有构造方法的数组
		Constructor[] constructors = cl.getDeclaredConstructors();
		//遍历数组
		for(Constructor consturcor : constructors){
			System.out.print("  ");
			//获得方法的修饰符并打印
			String modifiers  = Modifier.toString(consturcor.getModifiers());
			if(modifiers.length() > 0){
				System.out.print(modifiers + " ");
			}
			//打印类名即构造函数名字
			System.out.print(cl.getName() + "(");
			//获得包含该方法所有参数类型的Class对象数组
			Class[] paramTypes = consturcor.getParameterTypes();
			//遍历数组
			for(int i = 0; i < paramTypes.length ; i++){
				if(i > 0){
					System.out.println(", ");
				}
				System.out.print(paramTypes[i].getName());
			
			}
			System.out.println(");");
		}
	
	}
	//打印该类的所有方法
	public static void printMethods(Class cl){
		System.out.println();
		//获得包含该类所有其他方法的数组
		Method[] methods = cl.getDeclaredMethods();
		//遍历数组
		for(Method method : methods){
			System.out.print("  ");
			//获得该方法的修饰符并打印
			String modifiers = Modifier.toString(method.getModifiers());
			if(modifiers.length() > 0){
				System.out.print(modifiers + " ");
			}
			//打印方法名
			System.out.print(method.getName() + "(");
			
			//获得该方法包含所有参数类型的Class对象的数组
			Class[] paramTypes = method.getParameterTypes();
			//遍历数组
			for(int i=0; i<paramTypes.length; i++){
				if(i > 0){
					System.out.print(",");
				}
				System.out.print(paramTypes[i].getName());
			}
			System.out.println(");");
		}
	}
	
	public static void printFields(Class cl){
		System.out.println();
		//获得包含该类所有属性的数组
		Field[] fields = cl.getDeclaredFields();
		//遍历数组
		for(Field field : fields){
			System.out.print("  ");
			//获得属性修饰符
			String  modifiers = Modifier.toString(field.getModifiers());
			//打印修饰符
			System.out.print(modifiers + " ");
			//获得属性类型的Class对象
			Class type = field.getType();
			//打印类型名字
			System.out.print(type.getName() + "");
			//打印属性名字
			System.out.println(field.getName());
			
			
		}
	}
}

eg:

enter class name like(eg  java.util.Date)
java.lang.Double
public final class java.lang.Double extends java.lang.Number{
  public java.lang.Double(double);
  public java.lang.Double(java.lang.String);

  public equals(java.lang.Object);
  public static toString(double);
  public toString();
  public hashCode();
  public static hashCode(double);
  public static min(double,double);
  public static max(double,double);
  public static native doubleToRawLongBits(double);
  public static doubleToLongBits(double);
  public static native longBitsToDouble(long);
  public volatile compareTo(java.lang.Object);
  public compareTo(java.lang.Double);
  public byteValue();
  public shortValue();
  public intValue();
  public longValue();
  public floatValue();
  public doubleValue();
  public static valueOf(java.lang.String);
  public static valueOf(double);
  public static toHexString(double);
  public static compare(double,double);
  public static isNaN(double);
  public isNaN();
  public static isFinite(double);
  public static isInfinite(double);
  public isInfinite();
  public static sum(double,double);
  public static parseDouble(java.lang.String);

  public static final doublePOSITIVE_INFINITY
  public static final doubleNEGATIVE_INFINITY
  public static final doubleNaN
  public static final doubleMAX_VALUE
  public static final doubleMIN_NORMAL
  public static final doubleMIN_VALUE
  public static final intMAX_EXPONENT
  public static final intMIN_EXPONENT
  public static final intSIZE
  public static final intBYTES
  public static final java.lang.ClassTYPE
  private final doublevalue
  private static final longserialVersionUID
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值