Java反射机制(四)

一、创建运行时类的对象

有了Class对象,能做什么?

创建类的对象:调用Class对象的newInstance()方法

要求:

  1. 类必须有一个无参的构造器
  2. 类的构造器的访问权限需要足够

难道没有无参的构造器就不能创建对象了吗?

不是!只要在操作的时候明确的调用类中的构造器,并将参数传递进去之后,才可以实例化操作。

步骤如下:

  1. 通过Class类的getDeclaredConstructor(Class...parameterTypes) 取得本类的指定形参类型的构造器。
  2. 向构造器的形参中传递一个对象数组进去,里面包含了构造器中所需的各个参数。
  3. 通过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()

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值