一、反射(Reflect)描述
JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法。对于任意一个对象,都能够调用它的任意一个方法和属性,这是由Class对象来完成的,这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。
要想解剖一个类,必须先要获取到该类的字节码文件对象。而解剖使用的就是Class类中的方法.所以先要获取到每一个字节码文件对应的Class类型的对象.
Class 代表整个类
——FeField 属性
——MeThod方法
——Constructor 方法
二、Class类
2.1 创建Class类的几种方式
//c引用保存内存地址指向堆中的对象,该对象代,会执行静态语句块
Class c = Class.forNmae(String className);
//每个类型都有Class属性,不会执行静态语句块
Class c=ClassName.class;
//返回运行时类,通过对象.cgetClass()获取
User user=new User();
Class c=user.getClass();
//通过newInstance()方法获取当前Class类的一个新实例
//或调用类的无参数构造方法
Object 0=c.newInstance();
2.2 Fields 获取属性
//获取所有被Public修饰的属性
Field [] fs=c.getFields();
//获取所有属性
Field [] fs=c.getDeclaredFiedls();
//获取修饰符
int i=fs.getModiFields();
String strModfire=Modifire.toString(i);//将Int转化为String
//获取字段的声明类型
Class type=fis.getType();
String name=type.getName();
//获取字段名
String name=fs[i].getName();
//获取特定的属性
Field field=c.getDeclaredFiedls("name");
//赋值
Object o=c.newInatance();
//若属性为私有,无法访问,可以使用打破私有,但因此打破了封装性
field.setAccessiable(true);
field.set(o,"赋值");
//获取值
field.get(o);
2.3 Method 方法
//获取所有的方法
Method [] ms=c.getDeclaredMethods();
//获取方法修饰符
int i=ms[i].getModifires();
String modifireName=Modifire.toString(i)
//获取返回值类型
Class returnType=ms[i].getReturnType();
String name=returnType.getSimpleName();
//获取方法名
String name=ms.getName();
//获取方法形式参数列表类型
Class[] parmeters=ms.getParmeterTypes();
//获取某个特定的方法
//需要方法名+参数列表,如下获取methodName方法,传入方法名,以及形参类型
Method m=c.getDeclaredMethod("methodName",String.class,String.class);
Object o=c.newInstance();
Object retValue=m.invoke(0,"实参","实参")
2.4 Constructor 构造方法
//获取所有的构造方法
Constructor[] cs=c.getDeclaredConstructor();
//获取修饰符
int i=cs[i].getModifires();
String modifireName=Modifire.toString(i)
//获取构造方法名
String name=cs[i].getName();
//获取构造方法的形式参数列表
Class[] parmterTypes=cs[i].getParamterTypes();
parmterTypes.getName();
//获取特定的构造方法,创建对象,传入新参类型
Constructor con=c.getDeclaredConstructor(String.class,int.class);
//创建对象
Object o=con.newInstance("XX",10);
2.5 获取父类或父接口
//获取父类
Class superClass=c.getSuperclass();
superClass.getName();
//获取父接口
Class[] ins=c.getInterfaces();
ins[i].getName();