java反射详解

Posted zzh-blog

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java反射详解相关的知识,希望对你有一定的参考价值。

1.什么是反射

  反射是一种间接操作目标对象的机制,在程序程序运行时(动态)获取或者设置对象自身的信息。只要给定类的名字,就可以通过反射获取类的所有信息,接着便能调用它的任何一个方法和属性。

    Java反射就是在运行状态中,对于任意一个类,只要知道类名,就能够得到或者知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意方法和属性;并且能改变它的属性。而这也是Java被视为动态(或准动态,为啥要说是准动态,因为一般而言的动态语言定义是程序运行时,允许改变程序结构或变量类型,这种语言称为动态语言。从这个观点看,Perl,Python,Ruby是动态语言,C++,Java,C#不是动态语言。)语言的一个关键性质。

2.反射机制的作用

1)在运行时判断任意一个对象所属的类。(通过 对象.getclass() 可以知道该对象是属于哪个类的)

2)在运行时判断任意一个类所具有的成员变量和方法。( 类对象.get...方法)

3)在运行时任意调用一个对象的方法(  对象)

4)在运行时构造任意一个类的对象

3.反射的步骤

 1 //1、通过对象调用 getClass() 方法来获取,通常应用在:比如你传过来一个 Object
 2 //  类型的对象,而我不知道你具体是什么类,用这种方法
 3   Person p1 = new Person();
 4   Class c1 = p1.getClass();
 5         
 6 //2、直接通过 类名.class 的方式得到,该方法最为安全可靠,程序性能更高
 7 //  这说明任何一个类都有一个隐含的静态成员变量 class
 8   Class c2 = Person.class;
 9         
10 //3、通过 Class 对象的 forName() 静态方法来获取,用的最多,
11 //   但可能抛出 ClassNotFoundException 异常
12   Class c3 = Class.forName("com.ys.reflex.Person");

4.哪里用到反射机制

    以通过配置文件来动态配置和加载类,以实现软件工程理论里所提及的类与类,模块与模块之间的解耦。反射最经典的应用是spring框架。

    jdbc中有一行代码:Class.forName(‘com.mysql.jdbc.Driver.class‘).newInstance();那个时候只知道生成驱动对象实例,后来才知道,这就是反射,现在很多框架都用到反射机制,hibernatestruts都是用反射机制实现的。

5.反射机制的优缺点

静态编译:在编译时确定类型,绑定对象,即通过

动态编译:运行时确定类型,绑定对象。动态编译最大限度的发挥了java的灵活性,体现了多态的应用,有利于降低类之间的耦合性。

             一句话,反射机制的优点就是可以实现动态创建对象和编译,体现出很大的灵活性,特别是在J2EE的开发中

    它的灵活性就表现的十分明显。比如,一个大型的软件,不可能一次就把把它设计的很完美,当这个程序编

    译后,发布了,当发现需要更新某些功能时,我们不可能要用户把以前的卸载,再重新安装新的版本,假如

    这样的话,这个软件肯定是没有多少人用的。采用静态的话,需要把整个程序重新编译一次才可以实现功能

    的更新,而采用反射机制的话,它就可以不用卸载,只需要在运行时才动态的创建和编译,就可以实现该功

    能。

         它的缺点是对性能有影响。使用反射基本上是一种解释操作,我们可以告诉JVM,我们希望做什么并且它

    满足我们的要求。这类操作总是慢于只直接执行相同的操作。

6.java反射API

3. JAVA反射API

    反射API用来生成在当前JAVA虚拟机中的类、接口或者对象的信息。

    Class:反射的核心类,可以获取类的属性,方法等内容信息。

    Field:Java.lang.reflect.表示类的属性,可以获取和设置类的中属性值。

    Method:Java.lang.reflect。表示类的方法,它可以用来获取类中方法的信息或者执行方法

    Construcor:Java.lang.reflect。表示类的构造方法。

 

通过 Class 类获取成员变量、成员方法、接口、超类、构造方法等

查阅 API 可以看到 Class 有很多方法:

  getName():获得类的完整名字。
  getFields():获得类的public类型的属性。
  getDeclaredFields():获得类的所有属性。包括private 声明的和继承类
  getMethods():获得类的public类型的方法。
  getDeclaredMethods():获得类的所有方法。包括private 声明的和继承类
  getMethod(String name, Class[] parameterTypes):获得类的特定方法,name参数指定方法的名字,parameterTypes 参数指定方法的参数类型。
  getConstructors():获得类的public类型的构造方法。
  getConstructor(Class[] parameterTypes):获得类的特定构造方法,parameterTypes 参数指定构造方法的参数类型。
  newInstance():通过类的不带参数的构造方法创建这个类的一个对象。

 

 

 

 

<wiz_tmp_tag id="wiz-table-range-border" contenteditable="false" style="display: none;">


















以上是关于java反射详解的主要内容,如果未能解决你的问题,请参考以下文章

java反射例子详解

JavaSE 语法基础 --- 反射(基础知识问答+代码详解)

Java-反射机制(超详解)

2018.8.1 Java中的反射和同步详解

(转) Java中的负数及基本类型的转型详解

反射机制