一.反射的基本概念

  • 程序运行期间,动态的获取类的基本信息。

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

二.反射常用类

  • Class类—可获取类和类的成员信息

  • Field类—可访问类的属性

  • Method类—可调用类的方法

  • Constructor类—可调用类的构造方法

如果大家在学习过程中遇到什么问题,或者缺乏相关的Java学习资料,可查看右侧公告栏获取,有问题随问随答,还有我这段时间整理的一些Java学习手册,面试题,开发工具,PDF文档书籍教程,需要的话都可以免费分享给大家。

三.使用反射的基本步骤

  • 1.导入java.lang.reflect.*

  • 2.获得需要操作的类的Java.lang.Class对象

  • 3.调用Class的方法获取Field、Method等对象

  • 4.使用反射API进行操作(设置属性﹑调用方法)

四.Class类讲解

java.lang.class是反射的源头:我们创建了一个类,通过编译(javac.exe)生成对应的.class文件,之后我们使用java.exe加载(JVM的类加载器完成的)此class文件加载到内存以后,就是一个运行时类,存在缓存区。那么这个运行类本身就是一个Class的实例!

(1)Class类是反射机制的起源和入口

  • 每个类都有自己的Class对象

  • 用于获取与类相关的各种信息

  • 提供了获取类信息的相关方法

  • Class类继承自Object类

(2)Class类存放类的结构信息

  • 类名

  • 父类﹑接口

  • 方法﹑构造方法﹑属性

  • 注释

(3)获取 Class对象的方式

  • 第一种方式:对象.getClass()

//方法1:对象.getClass()

Student stu=new Student();

Class clazz=stu.getClass();

  • 第二种方式:类.class

//方法2:类.class

clazz= Student.class;

clazz=String.class;

  • 第三种方式:Class.forName()

//方法3:Class.forName()

clazz=Class.forName("java.lang.String");

clazz=Class.forName("java.util.Date");

  • 补充常见案例

//注册驱动程序最常见的方法是使用Java的Class.forName()方法,将驱动程序的类文件动态加载到内存中,并将其自动注册

  try {

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

  }

    catch(ClassNotFoundException ex) {

    System.out.println("Error: unable to load driver class!");

    System.exit(1);

  }

 

(4)获取类的其他结构信息

 

Class clazz = Class.forName("java.lang.Object");

Field fields[ ] = clazz.getDeclaredFields();//获取Field 对象

Method methods[] = clazz.getDeclaredMethods();//获取Method 对象

Constructor constructors[ ] = clazz.getDeclaredConstructors();//获取Constructor对象

 

(5)动态创建对象

  • 方法一:使用Class的newInstance()方法,仅适用于无参构造方法

Class clazz=Class.forName("com.wuhan.reflection.Student");

Object obj=clazz.newInstance();

  • 方法二:调用Constructor的newInstance()方法,适用所有构造方法

Constructor cons = clazz.getConstructor(new Class[]{ String.class,  int.class, float.class});

Object obj = cons.newInstance(new Object[ ] {"lkl", 32, 56.5f });

(6)动态执行方法

  • 调用方法基本步骤

  • 1.通过Class对象获取Method 对象

  • 2.调用Method对象的invoke()方法

  • 例如:

Object invoke(Object obj,Object [] args);

//object 返回值

//obj 当前方法所属对象

//args 当前方法的参数列表

(7)反射动态操作属性值

  • 操作属性的基本步骤

  • 1.通过Class对象获取Field 对象

  • 2.调用Field 对象的方法进行取值或赋值操作

(8)反射技术的优点和缺点

  • 优点:

  • 1.提高了Java程序的灵活性和扩展性,降低了耦合性,提高自适应能力

  • 2.允许程序创建和控制任何类的对象,无需提前硬编码目标类

  • 缺点:

  • 1.性能问题

  • 2.代码维护问题

完结!撒花!!!

内容来源于网络如有侵权请私信删除

文章来源: 博客园

原文链接: https://www.cnblogs.com/lcywuwuwu/p/14040597.html

你还没有登录,请先登录注册
  • 还没有人评论,欢迎说说您的想法!