Java--(一)反射之分析类的能力

最近正在看《Java核心技术 卷一》,学习Java基础知识,看书难免有所枯燥,所以打开博客复习记录一下学习心得。

反射机制当中最重要的无疑是检查类的结构,通过查看源码了解到Field,Method和Constructor分别用于描述类的域、方法和构造器,这三个类都有getName方法,用来返回项目的名称,还有getModifiers方法,用来描述修饰符。Class类中getField,getMethod,getConsturctor方法,分别返回类提供的public域,方法和构造器数组(这里返回的是数组)根据书上内容打完了代码,

public class Test {
	public static void main(String[] args) {
		//read class name from command line args or user input
		//从命令行参数或用户输入读取类名。
		String name;
		if (args.length>0) {
			name = args[0];
		}
		else {
			Scanner in = new Scanner(System.in);
			System.out.println("Enter class name(e.g java.util.Date): ");
			name = in.next();
		}
		
	
		try {
			
			//print class name and superclass name(if != Object)
			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("extend "+supercl.getName());
			
			System.out.println("\n{\n");
			printConstructors(cl);
			System.out.println();
			printMethods(cl);
			System.out.println();
			printFields(cl);
			System.out.println("}");
			
			
			
		} catch (ClassNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		System.exit(0);
	}

	
	/**
	 * Print all fields of a class
	 * @param cl
	 */
	
	private static void printFields(Class cl) {
		System.out.println("\t\t类的域");
		Field[] fields = cl.getDeclaredFields();
		
		for (Field f : fields) {
			Class type = f.getType();
			String name = f.getName();
			System.out.print("  ");
			//获取修饰符
			String modifiers = Modifier.toString(f.getModifiers());
			if (modifiers.length()>0) System.out.print(modifiers+" ");
			System.out.println(type.getName()+""+";");
		}
	}
	
	
	/**
	 * Print all Methods of a class
	 * @param cl
	 */
	
	
	private static void printMethods(Class cl) {
		System.out.println("\t\t类的方法");
		Method[] methods = cl.getDeclaredMethods();
		
		for (Method m : methods) {
			Class retType = m.getReturnType();
			String name = m.getName();
			
			System.out.print(" ");
			//print modifiers ,return type and method name
			String modifiers = Modifier.toString(m.getModifiers());
			if (modifiers.length()>0) System.out.print(modifiers+" ");
			System.out.print(retType.getName()+""+name+"(");
			
			//print parameter types
			Class[] paramTypes = m.getParameterTypes();
			for (int i = 0; i < paramTypes.length; i++) {
				if (i>0) System.out.print(", ");
				System.out.print(paramTypes[i].getName());
			
			}
			System.out.println(");");
		}
	}
	
	
	/**
	 * Print all constructors of a class
	 * @param cl
	 */
	
	
	private static void printConstructors(Class cl) {
		System.out.println("\t\t类的构造器");
		//getDeclaredConstructors()返回一组{@code构造函数}对象,反映由该对象所表示的类声明的所有构造函数
		Constructor constructors[] = cl.getDeclaredConstructors();
		
		for (Constructor c : constructors) {
			String name = c.getName();
			System.out.print("  ");
			//获取修饰符
			String modifiers = Modifier.toString(c.getModifiers());
			if (modifiers.length()>0) System.out.print(modifiers+" ");
			System.out.print(name+"(");
			
			//print parameter types
			//打印参数类型
			Class[] paramTypes = c.getParameterTypes();
			for (int i = 0; i < paramTypes.length; i++) {
				if (i>0) System.out.print(", ");
				System.out.print(paramTypes[i].getName());
			
			}
			System.out.println(");");
		}
	}
}

测试一下Java,util.Date,结果如下:

Enter class name(e.g java.util.Date): 
 java.util.Date
public class java.util.Date
{

		类的构造器
  public java.util.Date(java.lang.String);
  public java.util.Date(int, int, int, int, int, int);
  public java.util.Date(int, int, int, int, int);
  public java.util.Date();
  public java.util.Date(long);
  public java.util.Date(int, int, int);

		类的方法
 public booleanequals(java.lang.Object);
 public java.lang.StringtoString();
 public inthashCode();
 public java.lang.Objectclone();
 public volatile intcompareTo(java.lang.Object);
 public intcompareTo(java.util.Date);
 private voidreadObject(java.io.ObjectInputStream);
 private voidwriteObject(java.io.ObjectOutputStream);
 private final sun.util.calendar.BaseCalendar$Datenormalize(sun.util.calendar.BaseCalendar$Date);
 private final sun.util.calendar.BaseCalendar$Datenormalize();
 public static longparse(java.lang.String);
 public booleanbefore(java.util.Date);
 public booleanafter(java.util.Date);
 public static java.util.Datefrom(java.time.Instant);
 private static final sun.util.calendar.BaseCalendargetCalendarSystem(long);
 private static final sun.util.calendar.BaseCalendargetCalendarSystem(int);
 private static final sun.util.calendar.BaseCalendargetCalendarSystem(sun.util.calendar.BaseCalendar$Date);
 private final longgetTimeImpl();
 public static longUTC(int, int, int, int, int, int);
 private final sun.util.calendar.BaseCalendar$DategetCalendarDate();
 public intgetYear();
 public voidsetDate(int);
 public voidsetYear(int);
 public intgetMonth();
 public voidsetMonth(int);
 public intgetDay();
 public intgetHours();
 public voidsetHours(int);
 public intgetMinutes();
 public voidsetMinutes(int);
 public intgetSeconds();
 public voidsetSeconds(int);
 public voidsetTime(long);
 static final longgetMillisOf(java.util.Date);
 private static final java.lang.StringBuilderconvertToAbbr(java.lang.StringBuilder, java.lang.String);
 public java.lang.StringtoLocaleString();
 public java.lang.StringtoGMTString();
 public intgetTimezoneOffset();
 private static final synchronized sun.util.calendar.BaseCalendargetJulianCalendar();
 public java.time.InstanttoInstant();
 public longgetTime();
 public intgetDate();

		类的域
  private static final sun.util.calendar.BaseCalendar;
  private static sun.util.calendar.BaseCalendar;
  private transient long;
  private transient sun.util.calendar.BaseCalendar$Date;
  private static int;
  private static final long;
  private static final [Ljava.lang.String;;
  private static final [I;
}

事后对照了一下API文档,结果相同,希望对于跟我一样的初学者有所帮助,加油~~~

小伙伴们可以关注我的公众号,留言必回复哦

Java核心基础

----------------------------------

长按关注哦(看那两撇小胡子)

基础 | 心得 | 经历 | 更重要的是开心嘛!


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值