Java反射机制学习笔记
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;i<css.length;i++)
{
if(i>0)
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<types.length;i++)
{
if(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();
}
}
}
下面是结果