反射机制概述
lReflection(反射)是被视为动态语言的关键,反射机制允许程序在执行期 借助于ReflectionAPI取得任何类的内部信息,并能直接操作任意对象的内 部属性及方法。
l加载完类之后,在堆内存的方法区中就产生了一个Class类型的对象(一个 类只有一个Class对象),这个对象就包含了完整的类的结构信息。我们可 以通过这个对象看到类的结构。这个Class对象就像一面镜子,透过这个镜子看 到类的结构,所以,我们形象的称之为:反射。
Java不是动态语言,但Java可以称之为“准动态语言”。即Java有一定的动 态性,我们可以利用反射机制、字节码操作获得类似动态语言的特性。
Java的动态性让编程的时候更加灵活!


Class类与获取Class的实例
在Object类中定义了以下的方法,此方法
将被所有子类继承:(所有类都继承了object的getClass方法)
●public final Class getClass()
以上的方法返回值的类型是一个Class类, 此类是Java反射的源头。
创建运行时类的对象
//1.根据全类名获取对应的Class对象
String name =“com.ydgk.Person”;
Class clazz =null;
clazz = Class.forName(name);
//2.调用指定参数结构的构造器,生成Constructor的实例
Constructor con =clazz.getConstructor(String.class,Integer.class);
//3.通过Constructor的实例创建对应类的对象,并初始化类属性
Person p2 = (Person) con.newInstance(“Peter”,20);
System.out.println(p2);
获取运行时类的完整结构

1.实现的全部接口
public Class<?>[]getInterfaces()
确定此对象所表示的类或接口实现的接口。
2.所继承的父类
public Class<? Super T>getSuperclass()
返回表示此Class所表示的实体(类、接口、基本类型)的父类的
Class。
3.全部的构造器
public Constructor
返回此Class 对象所表示的类的所有public构造方法。
public Constructor
返回此Class 对象表示的类声明的所有构造方法。
Constructor类中:
取得修饰符:publicintgetModifiers();
取得方法名称:publicString getName();
取得参数的类型:publicClass<?>[]getParameterTypes();
4.全部的方法
public Method[]getDeclaredMethods()
返回此Class对象所表示的类或接口的全部方法
public Method[]getMethods()
返回此Class对象所表示的类或接口的public的方法
Method类中:
publicClass<?>getReturnType()取得全部的返回值
publicClass<?>[]getParameterTypes()取得全部的参数
publicintgetModifiers()取得修饰符
publicClass<?>[]getExceptionTypes()取得异常信息
5.全部的Field
public Field[]getFields()
返回此Class对象所表示的类或接口的public的Field。
public Field[]getDeclaredFields()
返回此Class对象所表示的类或接口的全部Field。
lField方法中:
publicintgetModifiers() 以整数形式返回此Field的修饰符
publicClass<?>getType() 得到Field的属性类型
publicStringgetName() 返回Field的名称。
6.Annotation相关
get Annotation(Class
getDeclaredAnnotations()
7.泛型相关
获取父类泛型类型:TypegetGenericSuperclass()
泛型类型:ParameterizedType
获取实际的泛型类型参数数组:getActualTypeArguments()
8.类所在的包 PackagegetPackage()


Object invoke(Object obj,Object… args)
说明:
1.Object对应原方法的返回值,若原方法无返回值,此时返回null
2.若原方法若为静态方法,此时形参Object obj可为null
3.若原方法形参列表为空,则Object[]args为null
4.若原方法声明为private,则需要在调用此invoke()方法前,显式调用 方法对象的setAccessible(true)方法,将可访问private的方法。

通过反射获得ArrayList的反射对象,并调用add方法
