本文共 4378 字,大约阅读时间需要 14 分钟。
1.什么是Java反射
反射是指可以分析一个类的功能的程序。
2.反射的原理
java运行时系统在程序运行时,需要识别程序中的对象,于是会为每个对象提供一个表示信息,
来区别对象所属的类型,这个标识信息保存了类的相关信息。于是Java提供了一个类用来存储这些信息,他就是Class类。
获取对象的Class类有三种方法。
①getClass()方法 例子: String s="abc"; Class c=s.getClass();//这里的c就包含了String类型的相关信息。 通过c.getName()方法可以获取String类型的名字。 ②Class.forName()方法 如:Class c=Class.forName("java.time.LocalDate"); ③class属性 Class c=String.class;
3.前面说了反射的概念,下面来看实用。
**一.**记住几个重要的方法 首先先记住4个类,Class,Constructor(构造器类),Field(域类),Method(方法类),Modifier(修饰符类); ①**Class的方法,你需要记住下面8个,很重要。**方法 | 描述 |
---|---|
Field[] getFields() | 获取所有公有域(包括继承得到的公有域),并返回Field数组,如果是基础数据类型或数组类型或没有域,返回大小为0的数组。 |
Filed[] getDeclaredFie1ds() | 获取类的所有域(包括继承得到的),并返回Field数组如果是基础数据类型或数组类型或没有域,返回大小为0的数组。 |
Method[] getMethods() | 获取所有公有方法(包括继承得到的),并返回Method数组 |
Method[] getDeclareMethods() | 获取类或接口的所有公有方法(不包括继承得到的),并返回Method数组 |
Constructor[] getConstructors() | 类的所有公有构造器 |
Constructor[] getDeclaredConstructors() | 类的所有构造器 |
int getModifiers( ) | 返回的整型数值。 |
String getName( ) | 返冋类名字符串。 |
②Constructor,Field,Method的方法
方法 | 描述 |
---|---|
Class[] getExceptionTypes ( ) | 在 Constructor 和 Method 类 中返回一个用于描述方法抛出的异常类型的 Class 对象数组。 |
int getModifiers( ) | 返回一个用于描述构造器、 方法或域的修饰符的整型数值。 |
String getName( ) | 返冋一个用于描述构造器、 方法或域名的字符串。 |
Class[] getParameterTypes ( ) | 在 Constructor 和 Method类中返回一个用于描述参数类型的 Class 对象数组。 |
Class getReturnType( ) | 在 Method 类 中返回一个用于描述返回类型的 Class 对象。 |
③Modifier的方法,很多,我下面讲代码是用到的方法有这个
方法 | 描述 |
---|---|
static String toString(int modifiers ) | 返回对应 modifiers 中位设置的修饰符的字符串表示。 |
就是上面的Class与其他三个类的getModifiers方法返回的值放到这可以返回它们对应的名字。
**二.**代码实战package ReflectTest;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 ReflectTest { static Class cL;//本类 static Class supercl;//父类 public static void main(String[] args) { String ClassName = "";//接收类名 try { if(args.length>0) { ClassName=args[0]; cL = Class.forName(ClassName); supercl = cL.getSuperclass(); } else { Scanner scan = new Scanner(System.in); ClassName = scan.next(); cL=Class.forName(ClassName); supercl = cL.getSuperclass(); } } catch (ClassNotFoundException e) { e.printStackTrace(); } String modifier = Modifier.toString(cL.getModifiers()); if(modifier.length()>0) System.out.print(modifier+" "); System.out.print("class"+" "+ClassName+" "); if(supercl.getName().length()>0&&supercl!=Object.class) System.out.print("extends"+" "+ supercl.getName()); System.out.println("{"+"\n"); printConstructors(cL); System.out.println(); printMethods(cL); System.out.println(); printFields(cL); System.out.println("}"); } static void printConstructors(Class c){ Constructor[] cons = c.getDeclaredConstructors(); for (Constructor con : cons ) { String modifierWords = Modifier.toString(con.getModifiers()); if(modifierWords.length()>0) { System.out.print(modifierWords+" "); } System.out.print(con.getName()+"("); Class[] css = con.getParameterTypes(); for(int i=0;i0) System.out.print(","+css[i].getName()); else System.out.print(css[i].getName()); } System.out.println(")"+";"); } } static void printMethods(Class c) { Method[] methods = c.getDeclaredMethods(); for(Method method : methods) { Class[] types = method.getParameterTypes(); System.out.print(Modifier.toString(method.getModifiers())+" "+method.getReturnType().getName()+" "+method.getName()+"("); for(int i=0;i 0) System.out.print(","+types[i].getName()); else System.out.print(types[i].getName()); } System.out.println(")"+";"); } } static void printFields(Class c) { Field[] fields = c.getFields(); for(Field field : fields) { System.out.print(field.getType().getName()+" "+field.getName()+";"); System.out.println(); } }}
下面是结果
转载地址:http://milzi.baihongyu.com/