一、创建运行时类的对象
有了Class对象,能做什么?
创建类的对象:调用Class对象的newInstance()方法
要求:
- 类必须有一个无参的构造器
- 类的构造器的访问权限需要足够
难道没有无参的构造器就不能创建对象了吗?
不是!只要在操作的时候明确的调用类中的构造器,并将参数传递进去之后,才可以实例化操作。
步骤如下:
- 通过Class类的getDeclaredConstructor(Class...parameterTypes) 取得本类的指定形参类型的构造器。
- 向构造器的形参中传递一个对象数组进去,里面包含了构造器中所需的各个参数。
- 通过Constructor实例化对象。
1.根据全类名获取对应的Class对象
String name = “atguigu.java.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);
二、获取运行时类的完整结构
通过反射获取运行时类的完整结构
Field、Method、Constructor、Superclass、Interface、Annotation
- 实现的全部接口
- 所继承的父类
- 全部构造器
- 全部的方法
- 全部的Field
使用反射可以取得:
1、实现全部接口
public Class<?>[] getInterfaces()确定此对象所表示的类或接口实现的接口。
2、所继承的父类
public Class<? Super T> getSuperclass()返回表示此 Class 所表示的实体(类、接口、基本类型)的父类的Class
3、全部的构造器
public Constructor<T>[] getConstructors() --> 返回此 Class 对象所表示的类的所有 public 构造方法。public Constructor<T>[] getDeclaredConstructors() --> 返回此 Class 对象表示的类声明的所有构造方法。Constructor类中:取得修饰符 : public int getModifiers();取得方法名称 : public String getName();取得参数的类型: public Class<?>[] getParameterTypes() ;
4、全部的方法
public Method[] getDeclaredMethods() --> 返回此Class 对象所表示的类或接口的全部方法public Method[] getMethods() --> 返回此Class 对象所表示的类或接口的 public 的方法Method类中:public Class<?> getReturnType() 取得全部的返回值public Class<?>[] getParameterTypes() 取得全部的参数public int getModifiers() 取得修饰符public Class<?>[] getExceptionTypes() 取得异常信息
5、全部的Field
public Field[] getFields() --> 返回此 Class 对象所表示的类或接口的 public 的 Field 。public Field[] getDeclaredFields() --> 返回此 Class 对象所表示的类或接口的全部 Field 。Field方法中:
public int getModifiers() 以整数形式返回此Field的修饰符
public Class<?> getType() 得到 Field 的属性类型public String getName() 返回 Field 的名称。
6、Annotation相关
get Annotation(Class<T> annotationClass)getDeclaredAnnotations()
7、泛型相关
获取父类泛型类型: Type getGenericSuperclass()泛型类型: ParameterizedType获取实际的泛型类型参数数组: getActualTypeArguments()
8、类所在的包:Package getPackage()