Java反射

反射简介

反射的核心是 JVM 在运行时才动态加载类或调用方法/访问属性,它不需要事先(写代码的时候或编译期)知道运行对象是谁。

  • 反射提供的功能有:
    • 在运行时构造任意一个类的对象
    • 在运行时获取对象的包名、类修饰符、属性、构造器、方法、实现的接口、子类、超类等
    • 在运行时调用任意对象的任意方法

反射使用

  • 获取Class对象:

    1. 通过类名.class,获取对象。
    2. 通过调用继承自Object对象的getClass()方法获取对象。
    3. 通过Class.forName(String className) Class类静态方法className需从包名精确到类,来获取对象。
  • 通过反射来生成对象主要有两种方式。

    1. 使用Class对象的newInstance()方法来创建Class对象对应类的实例。
      public T newInstance(){}
      
    2. 先通过Class对象获取指定的Constructor对象,再调用Constructor对象的newInstance()方法来创建实例。这种方法可以用指定的构造器构造类的实例。
      public Constructor<?>[] getConstructors() throws SecurityException {}
      
  • 获取类构造器的用法与上述获取方法的用法类似。主要是通过Class类的getConstructor()方法得到Constructor类的一个实例,而Constructor类有一个newInstance()方法可以创建一个对象实例:

    1. 使用Class对象.getConstructor()方法,获取构造器对象:
      public Constructor<T> getConstructor(Class<?>... parameterTypes)
      throws NoSuchMethodException, SecurityException {}
      
    2. 使用Constructor对象.newInstance() 方法,即所有构造类均可使用此方法创建一个对象实例:
      	public T newInstance(Object ... initargs){}
      
      此方法可以根据传入的参数来调用对应的Constructor创建对象实例。
  • 获取类对象的属性即成员变量:

    1. Class对象.getFiled(String name):访问公有的成员变量
      public Field getField(String name)
      throws NoSuchFieldException, SecurityException {}
      
    2. Class对象.getDeclaredField(String name):所有已声明的成员变量,但不能得到其父类的成员变量
       public Field getDeclaredField(String name)
      throws NoSuchFieldException, SecurityException {}
      
    3. Class对象.getFileds()Class对象.getDeclaredFields() 方法用法:
      public Field[] getFields() throws SecurityException {}
      
  • 获取某个Class对象的方法集合,主要有以下几个方法:

    1. 使用 Class对象.getDeclaredMethods()方法返回类或接口声明的所有方法,包括公共、保护、默认(包)访问和私有方法,但不包括继承的方法。
      public Method[] getDeclaredMethods() throws SecurityException {}
      
    2. 使用 Class对象.getMethods()方法返回某个类的所有公用(public)方法,包括其继承类的公用方法。
      public Method[] getMethods() throws SecurityException {}
      
    3. 使用 Class对象.getMethod(String name,Class<?>...parameterTypes)方法返回一个特定的方法,其中第一个参数为方法名称,后面的参数为方法的参数对应Class的对象。
      public Method getMethod(String name, Class<?>... parameterTypes){}
      
  • 从类中获取了一个方法后,我们就可以用 invoke() 方法来调用这个方法。invoke方法定义在Method类中:

    1. 使用Method对象.invoke()方法,即所有方法均可使用此方法调用 参数类中的此方法(args为方法参数):
      public Object invoke(Object obj, Object... args)
      	throws IllegalAccessException, IllegalArgumentException,
         	InvocationTargetException{}
      

更多:可查看Class类源码,Field类源码,Constructor类源码,Mathod源码、java.lang.reflect下的类等,均与反射有关。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值