标签:
最近继续回顾Java基础,进行到了Java反射这一部分,个人感觉这部分应该算是Java的高级特性了,在日常开发中使用的并不多,应用人员主要是工具构建人员,所以这次学习中以了解为主,Java反射主要应用在工具型项目的开发中,例如Spring。
在程序运行期间,JRE会为所有的对象创建一个类型标识,保存这些信息的类就是Class类,反射所有的功能都是围绕这个类来实现的,获取方法有以下几种:
1.new Date().getClass();
2.Date.class;
3.Class.forName(java.util.Date)
基础方法如下(更多方法请查看API):
1.Class.getName() 返回类名
2.Class.newInstance() 根据Class对象创建实例
3.Class.getDeclaredFields() 获取类的属性数组
4.Class.getDeclaredMethods() 获取类的方法数组
5.Class.getDeclaredConstructors() 获取类的构造器数组
6.Field/Method/Constructor.getModifiers() 获取属性/方法/构造器的修饰符
下面附上一个解析类的DEMO,运行结果如下:
代码如下:
package com.demo.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; /** * Java反射获取类内容 * @author liweitao * */ public class PrintClass { public static void main(String[] args) { Scanner scanner = new Scanner(System.in); System.out.println("enter a class name"); String name = scanner.nextLine(); try { Class cls = Class.forName(name); String modifier = Modifier.toString(cls.getModifiers()); Class superCls = cls.getSuperclass(); Class[] interCls = cls.getInterfaces(); System.out.print(modifier +" class " + name); if(superCls != null && superCls != Object.class){ System.out.print(" extends " + superCls.getName()); } for(int i = 0; i < interCls.length; i++){ if(i == 0){ System.out.print(" implements "); }else if(i > 0){ System.out.print(","); } System.out.print(interCls[i].getName()); } System.out.println("{"); printFields(cls); printConstructors(cls); printMethods(cls); System.out.print("}"); } catch (ClassNotFoundException e) { e.printStackTrace(); } } /** * 打印字段 * @param cls */ public static void printFields(Class cls){ Field[] fields = cls.getDeclaredFields(); for(Field field : fields){ StringBuffer result = new StringBuffer(); Class type = field.getType(); String name = field.getName(); String modifiers = Modifier.toString(field.getModifiers()); if(modifiers.length() > 0){ result.append("\t").append(modifiers).append(" ") .append(type.getName()).append(" ").append(name); } System.out.println(result.toString()); } } /** * 打印构造器 * @param cls */ public static void printConstructors(Class cls){ Constructor[] constructors = cls.getDeclaredConstructors(); for(Constructor constructor : constructors){ StringBuffer result = new StringBuffer(); String name = constructor.getName(); String modifiers = Modifier.toString(constructor.getModifiers()); if(modifiers.length() > 0){ result.append("\t").append(modifiers).append(" ").append(name).append("("); } Class[] params = constructor.getParameterTypes(); for(int j = 0; j < params.length; j++){ if(j > 0){ result.append(","); } result.append(params[j].getName()); } result.append(")"); System.out.println(result.toString()); } } public static void printMethods(Class cls){ Method[] methods = cls.getDeclaredMethods(); for(Method method : methods){ StringBuffer result = new StringBuffer(); String name = method.getName(); Class returnType = method.getReturnType(); String modifier = Modifier.toString(method.getModifiers()); Class[] params = method.getParameterTypes(); if(modifier.length() > 0){ result.append("\t").append(modifier).append(" ") .append(returnType.getName()).append(" ").append(name).append("("); } for(int j = 0; j < params.length; j++){ if(j > 0){ result.append(","); } result.append(params[j].getName()); } result.append(")"); System.out.println(result.toString()); } } }
标签:
原文地址:http://www.cnblogs.com/aotian/p/4967752.html