JAVA反射知识点总结

举报
辰兮 发表于 2022/03/22 22:44:02 2022/03/22
【摘要】 本文介绍了JAVA反射类的基本概念,欢迎阅读学习,一起进步。 文章目录 一.反射的基本概念二.反射常用类三.使用反射的基本步骤四.Class类讲解(1)Class类是反射机制的起源和入...

本文介绍了JAVA反射类的基本概念,欢迎阅读学习,一起进步。

一.反射的基本概念

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

二.反射常用类

  • Class类—可获取类和类的成员信息
  • Field类—可访问类的属性
  • Method类—可调用类的方法
  • Constructor类—可调用类的构造方法

三.使用反射的基本步骤

  • 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.代码维护问题

  • The best investment is in yourself
    在这里插入图片描述
  • 2020.03.18 记录辰兮的第31篇博客

文章来源: blessing.blog.csdn.net,作者:辰兮要努力,版权归原作者所有,如需转载,请联系作者。

原文链接:blessing.blog.csdn.net/article/details/104943177

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。