您的位置 首页 java

Java开发课程(十七)——反射

反射

1、 Java 反射机制

  • 反射概述

一反射的概念是由smith在1982年首次提出的,主要是指程序可以访问、检测和修改它本身状态或行为的一种能力。

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

一简单的来说,反射机制指的是程序在运行时能够获取自身的信息。在java中,只要给定类的名字,那么就可以通过反射机制来获得类的所有信息。包括其访问修饰符、父类、实现的接囗、属性和方法的所有信息,并可在运行时创建对象、修改属性(包括私有的)、调用方法(包括私有的)。

  • 反射机制

1、为什么要用反射机制?直接创建对象不就可以了吗,这就涉及到了动态与静态的概念:

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

Student stu=new Student("zhangsan",30);
 

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

Class.forName(.com.mysql.jdbc.Driver.class").newlnstance();
 

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

一它的缺点是对能有影响。使用反射基本上是一种解释操作,这类操作总是慢于直接执行的相同操作。

2、Java反射机制主要提供了以下功能:

一在运行时判断任意一个对象所属的类

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

一在运行时判断任意一个类所具有的成员变量和方法

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

  • Class对象

1、Class对象是Reflection故事起源。要想操纵类中的属性和方法,都必须从获取Class对象开始

一类是程序的一部分,每个类都有一个Class对象。换言之,每当编写并且编译了一个新类,就会产生与之对应的一个Class对象。

一Class类没有公共 构造方法 。Class对象是在加载类时由Java虚拟机以及通过调用类加载器中的方法自动构造的,因此不能显式地声明一个Class对象。

2、获取Class对象的方式有多种:

Java开发课程(十七)——反射


2、Java反射API

  • Java.lang.reflect库

1、Class类与java.lang.reflect类库一起对反射的概念进行支持。

2、java.lang包下:

一Class<T>:表示一个正在运行的Java应用程序中的类和接囗,是Reflection的起源。

3、java.lang.reflect包下:

一Field类:代表类的成员变量(成员变量也称为类的属性)。

一Method类:代表类的方法。

一Constructor类:代表类的构造方法。

一Array类:提供了动态创建数组,以及访问数组的元素的静态方法。

  • 通过反射 实例化 对象

1、平常情况我们通过newObject来生成一个类的实例,但有时候我们没法直接new,只能通过反射动态生成。

2、实例化无参 构造函数 的对象,两种方式:

一Class.newlnstance();

一Class.getConstructor(new Class[]{}).newlnstance(new Object[]{})

3、实例化带参构造函数的对象

一clazz.getConstructor(CIass<?>…parameterTypes).newlnstance(Object… initargs)

  • 通过反射获取调用方法

1、获得当前类以及超类的public Method

一Method[] arrMethods=classType.getMethods();

2、获得当前类申明的所有Method

一Method[] arrMethods=classType.getDecIaredMethods();

3、获得当前类以及超类指定的public Method

一Method method=classType.getMethod(String name,

Class<>… parameterTypes);

4、获得当前类申明的指定的Method

一Method method=classType.getDecIaredMethod(String name,

Class<?>… parameterTypes);

5、通过反射动态运行指定Method

一Object obj=method.invoke(Object obj,Object… args);

  • 通过反射获取调用属性

1、获得当前类以及超类的publicField

一Field[] arrFieIds=classType.getFieIds();

2、获得当前类申明的所有Field

一Field[] arrFieIds=classType.getDecIaredFieIds();

3、获得当前类以及超类指定的public Field

一Field field=classType.getFieId(String name);

4、获得当前类申明的指定的Field

一Field field=classType.getDecIaredField(String name);

5、通过反射动态设定和获取Field的值

一field.set(Object obj,Object value);

一Object obj=field.get(Object obj);

  • 反射总结

1、只要用到反射,先获得Class对象。

2、没有方法能获得当前类的超类的 private 方法和属性,你必须通过getSuperclass()找到超类以后再去尝试获得。

3、通常情况即使是当前类,private属性或方法也是不能访问的,你需要设置压制权限setAccessible(true)来取得private的访问权。但说实话,这已经破坏了面向对象的规则,所以除非万不得已,请尽量少用。

3、课程总结

  • Java反射机制
  • Java反射API

文章来源:智云一二三科技

文章标题:Java开发课程(十七)——反射

文章地址:https://www.zhihuclub.com/186360.shtml

关于作者: 智云科技

热门文章

网站地图