最近正在看《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核心基础
----------------------------------
长按关注哦(看那两撇小胡子)
基础 | 心得 | 经历 | 更重要的是开心嘛!