Java的反射机制

每日一问:

在java中如果仅仅知道一个类的类名,能否动态得到类的定义信息,包括哪些方法和属性等等?

目录

什么是java反射机制?

java反射的作用?

java反射相关的类?

class类

获得Class的三种方法

 获得Constructor类实例

获得Field实例

 获得Method实例

反射优点 

反射缺点 


答案:可以通过反射做到
那么--

什么是java反射机制?

概念:

        java反射机制是在运行状态中,对于任意一个类,都能知道这个类的所有属性和方法;并且对于任意一个对象,都能调用他的任意一个方法和属性--这种动态获取信息以及动态调用对象的方法的功能称为java语言的反射机制。

java反射的作用?

        动态获取类的信息

java反射相关的类?

java反射相关的类主要有:

  1. Class类型
  2. Constructor构造方法
  3. Method方法
  4. Field属性
  5. 所有类都在java.lang.reflect包中(除Class外)
        反射API将类的类型、方法、属性都封装成了类,其中最重要的类是Class,可以说,反射的使用都是从Class开始。

class类

        一旦class文件被加载到内存,就会为其创建一个Class对象。任何类被使用时都会创建一个Class对象。
        Class类是Java反射机制的基础,通过Class类,可以得到一个类的基本信息。

获得Class的三种方法

要使用Class类的方法,必须先获得该类的Class类的实例,获得Class类实例的常用方法有如下三种:
  1. Object类中的getClass方法:适用于通过对象获得Class实例的情况
  2. 类名.class方式:适用于通过类名获得Class实例的情况
  3. Class类的静态方法 forName(String name)

 获得Constructor类实例

Constructor实例通过Class实例获得,Class类中定义了如下方法:
        Constructor getConstructor(Class... parameterTypes) : 通过指定参数类型,返回构造方法实例。
Constructor类可以通过getXXX方法获得构造方法的基本信息:
        getName:返回构造方法的名字
除了获得构造方法的基本信息,还可以创建实例:
        newInstance(Object... initargs) :创建实例

获得Field实例

获得Field实例,都是通过Class中的方法实现:
        public Field getField(String name)通过指定Field名字,返回Field实例(注意field访问权限)

 Field类将类的属性进行封装,可以获得属性的基本信息、属性的值,也可以对属性进行赋值.

  • getName:返回属性的名字 
  • set:设置属性值

 获得Method实例

Method实例都是通过Class类的方法获得:

        Method getMethod(String name, Class... parameterTypes) : 通过指定方法名,参数类型,返回一个Method实例

Method类将类中的方法进行封装,可以动态获得方法的信息,例如:

  •  getName:获得方法名字
  • getParameterTypes:获得方法参数类型

 除了动态获得方法信息外,Method还能动态调用某一个对象的具体方法:

           invoke(Object obj, Object... args) :使用obj调用该方法,参数为args 

反射优点 

  优点:
 1. 增加程序的灵活性,可以在运行的过程中动态对类进行修改和操作。
 2. 提高代码的复用率,比如动态代理。
 3. 可以在运行时轻松获取任意一个类的方法、属性,并且还能通过反射进行动态调用。

反射缺点 

  缺点:
 1. 反射会涉及到动态类型的解析,导致性能要比非反射调用更低。
 2. 使用反射技术通常要在一个没有安全限制的程序运行。
 3. 反射可以绕过一些限制访问的属性或者方法,可能会导致破坏代码本身的抽象性。

你可能感兴趣的:(java基础知识,Java小常识,java,开发语言,intellij-idea)