反射

来源:互联网 发布:win10如何安装linux 编辑:程序博客网 时间:2024/05/05 19:27

反射

类字节码文件是在硬盘上存储的,是一个个的.class文件。我们在new一个对象时,JVM会先把字节码文件的信息读出来放到内存中,第二次用时,就不用在加载了,而是直接使用之前缓存的这个字节码信息。

字节码的信息包括:类名、声明的方法、声明的字段等信息。在Java中这些信息当然也需要封装成一个对象,这就是Class类、Method类、Field类。

通过Class类、Method类、Field类可以得到这个类的一些信息,甚至可以不用new关键字就创建一个实例对象,可以执行一个对象中的方法,设置或获取字段的值,这就是反射技术。

Class类

class类用于代表字节码文件对象。

获取Class对象

  1. forName()。forName方法用于加载某个类的字节码到内存中,并使用class对象进行封装
    代码如下:
Class clazz1=Class.forName("cn.lingadobe.test.Person");
  1. 类名.class
Class clazz2=Person.class();
  1. 对象.getClass();
Person p=new Person("张三");Class clazz3=p.getClass();

通常来说,第1种方法是最为常用的。

通过Class类获取类型的一些基本信息

  1. getName()
    类的名称(全名,全限定名)
  2. getSimpleName()
    类的的简单名称(不带包名)
  3. getModifiers();
    类的修饰符
  4. 创建对象
    无参数构造创建对象
    newInstance()
  5. 获取指定参数的构造器对象,并可以使用Constructor对象创建一个实例
    Constructor getConstructor(Class
private static void test2() throws Exception {        Class clazz1 = Class.forName("cn.lingadobe.test.Person");        // 获取类的名称        String name = clazz1.getName();        System.out.println(name); // cn.itcast.gz.reflect.Person        // 获取类的简单名称        System.out.println(clazz1.getSimpleName()); // Person        // 获取类的修饰符        int modifiers = clazz1.getModifiers();        System.out.println(modifiers);        // 构建对象(默认调用无参数构造.)        Object ins = clazz1.newInstance();        Person p = (Person) ins;        System.out.println(p);         // 获取指定参数的构造函数        Constructor con = clazz1.getConstructor(String.class, int.class);        // 使用Constructor创建对象.        Object p1 = con.newInstance("jack", 28);        System.out.println(((Person) p1).getName());    }

通过Class类获取类型中的方法信息(Method)

  1. 获取公共方法包括继承的父类的方法
    getMethods()返回一个数组,元素类型是Method
  2. 获取指定参数的公共方法
    getMethod(“setName”, String.class);
    其中第一个参数:就是想要获取的方法名称
    第二个参数:是想要获取的方法的参数列表,可以有多个
  3. 获得所有的方法,包括私有
    Method[] getDeclaredMethods()
  4. 获得指定参数的方法,包括私有
    Method getDeclaredMethod(String name, Class

通过Class类获取类型中的字段信息(field)

  1. 获取公共字段
    Field[] getFields()
  2. 获取指定参数的公共字段
    Field getField(String name)
  3. 获取所有的字段,包括私有
    Field[] getDeclaredFields()
  4. 获取指定参数的字段,包括私用
    Field getDeclaredField(String name)

灵活运用Class,Method,Field这三个类的方法

0 0
原创粉丝点击