反射——调用类的完整结构

通过反射来调用类的完整结构

Field、Method、Constructor、Superclass、Interface、Annotation

  • 实现的全部接口
  • 所继承的父类
  • 全部的构造器
  • 全部的方法
  • 全部的 Field

实现的所有接口

  • 确定此对象所表示的类或接口实现的接口。

    public Class<?>[] getInterfaces()
    

例如:

public class Test {
    public static void main(String[] args) {
        try {
            //调用 forName() 方法获取指定类的 Class 实例
            Class cla = Class.forName("com.aze.reflection.Student");
            //获取实现的所有接口
            Class[] ci = cla.getInterfaces();
            int i = 1;
            //遍历所有接口
            for (Class c : ci) {
                System.out.println("接口" + i + ":" + c);
                i++;
            }
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
    }
}

所继承的父类

  • 返回表示此 Class 所表示的实体(类、接口、基本类型)的父类的 Class

    public Class<? Super T> getSuperclass()
    

例如:

public class Test {
    public static void main(String[] args) {
        try {
            //通过 forName() 方法获取指定类的 Class 实例
            Class cla = Class.forName("com.aze.reflection.Student");
            //获取父类
            Class sc = cla.getSuperclass();
            System.out.println("父类是:" + sc);
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
    }
}

全部的构造器

  • 返回此 Class 对象所代表的类的所有 public 构造方法

    public Constructor<T>[] getConstructors()
    
 //获取类中公有地(public)构造方法
Constructor[] cc = cla.getConstructors();
// 遍历
for (Constructor c : cc) {
    // getModifiers()取得修饰符
    System.out.println("修饰符为:" + c.getModifiers());
    // getName()取得方法名称
    System.out.println("构造器名称为:" + c.getName());
    // getParameterTypes()取得参数类型
    Class[] cpt = c.getParameterTypes();
    for (Class s : cpt) {
        System.out.println("参数类型为:" + s);
    }
    System.out.println("------");
}
  • 返回此 Class 对象表示的类声明的所有构造方法

    public Constructor<T>[] getDeclaredConstructors()
    
//获取类中所有的构造方法
Constructor[] cc1 = cla.getDeclaredConstructors();
// 遍历
for (Constructor c : cc1) {
    // getModifiers()取得修饰符
    System.out.println("修饰符为:" + c.getModifiers());
    // getName()取得方法名称
    System.out.println("构造器名称为:" + c.getName());
    // getParameterTypes()取得参数类型
    Class[] cpt = c.getParameterTypes();
    for (Class s : cpt) {
        System.out.println("参数类型为:" + s);
    }
    System.out.println("------");
}
  • Constructor 类中:
    • 取得修饰符:

       public int getModeifiers();
      
    • 取得方法名称:

      public String getName();
      
    • 取得参数的类型:

      publi Class<T>[] getParameterTypes();
      

通过反射的构造方法来创建对象

  • 调用公有的无参构造
 Class cla = Class.forName("com.aze.reflection.Student");
// newInstance 实例化对象,相当于调用 Student 类的公有无参构造
Student s1 = (Student) cla.newInstance();//返回的是 Object 类型,这里进行强转
  • 调用公有的有参构造
// 指定获取一个参数且参数为 String 类型的公有有参构造方法
Constructor c1 = cla.getConstructor(String.class);
// newInstance 实例化对象,相当于调用 Student 类的公有且只有一个参数的有参构造
Student s2 = (Student)c1.newInstance("一中");
  • 调用所有(包括公有、私有)有参构造
//通过反射机制,强制调用私有的构造方法
// 指定获取两个参数且参数类型为 String、int 的所有构造方法
Constructor c2 = cla.getConstructor(String.class, int.class);
// 解除私有的封装,使下面可以对这个私有的方法强制调用
c2.setAccessible(true);
// newInstance 实例化对象,相当于调用 Student 类的所有且有两个参数的有参构造
Student s3 = (Student)c2.newInstance("二中",13);

全部的方法

  • 返回此 Class 对象所表示的类或接口的全部方法

    public Methode[] getDeclaredMethods()
    
Class cla = Class.forName("com.aze.reflection.Student");
// 获取类的所有的方法(包括公有私有)
Method[] cms = cla.getDeclaredMethods();
// 遍历
for (Method m : cms) {
    System.out.println("方法名:" + m.getName());
    System.out.println("修饰符:" + m.getModifiers());
    System.out.println("返回值类型:" + m.getReturnType());
    // 获取方法的参数类型,返回的是一个数组
    Class[] mp = m.getParameterTypes();
    if (mp != null && mp.length > 0){
        for (Class c : mp) {
            System.out.println("参数类型:" + c.getName());
        }
    }
    System.out.println("======================");
}
  • 返回此 Class 对象所表示的类或接口的 public 方法

    public Methode[] getMethods()
    
Class cla = Class.forName("com.aze.reflection.Student");
// 获取类的所有的公有方法
Method[] cms = cla.getMethods();
// 遍历
for (Method m : cms) {
    System.out.println("方法名:" + m.getName());
    System.out.println("修饰符:" + m.getModifiers());
    System.out.println("返回值类型:" + m.getReturnType());
    // 获取方法的参数类型,返回的是一个数组
    Class[] mp = m.getParameterTypes();
    if (mp != null && mp.length > 0){
        for (Class c : mp) {
            System.out.println("参数类型:" + c.getName());
        }
    }
    System.out.println("======================");
}
  • Method 类中:

    • 取得全部的返回值:

      public Class<?> getReturnType()
      
    • 取得全部的参数:

      public Class<?>[] getParameterTypes()
      
    • 取得修饰符:

      public int getModifiers()
      

全部的 Field

  • 返回此 Class 对象所表示的类或者接口的 public 的 Field,其中还包括父类中的公有属性。

    public Field[] getFields()
    
Class cla = Class.forName("com.aze.reflection.Student");
// 获取类的公有(public)的属性,其中还包含了父类的公有属性
Field[] fc = cla.getFields();
for (Field f : fc) {
    System.out.println("属性名:" + f.getName());
    System.out.println("修饰符:" + f.getModifiers());
    System.out.println("属性类型:" + f.getType());
    System.out.println("===================");
}
  • 返回此 Class 对象所表示的类或者接口的全部 Field,只返回本类的所有属性,不包括父类。

    public Field[] getDeclaredFields()
    
Class cla = Class.forName("com.aze.reflection.Student");
// 获取本类的所有属性,不包括父类的属性
Field[] fc = cla.getDeclaredFields();
for (Field f : fc) {
    System.out.println("属性名:" + f.getName());
    System.out.println("修饰符:" + f.getModifiers());
    System.out.println("属性类型:" + f.getType());
    System.out.println("===================");
}
  • Field 方法中:

    • 一整数形式返回此 Field 的修饰符:

      public int getModifiers()
      
    • 得到 Field 的属性类型:

      public Class<?> getType()
      
    • 返回 Field 的名称:

      public String getName()
      

类所在的包

  • Package getPackage()
    
Class cla = Class.forName("com.aze.reflection.Student");
Package pc = cla.getPackage();
System.out.println(pc.getName());
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值