zoukankan      html  css  js  c++  java
  • java基础学习之反射反射的基本概念及使用

    一.反射的基本概念

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

    • 对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为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.代码维护问题

    完结!撒花!!!

  • 相关阅读:
    Unity打包ARCore项目失败,但是其他安卓项目成功
    关于Unity 图片队列存储以及出列导致内存溢出的解决方案
    unity 使用 outline 组件
    7Z解压工具的BUG
    Unity ILRuntime 调用方法一览
    Python 免费插件
    SQL经典面试题及答案
    PL/SQL Developer中文注释乱码的解决办法
    Tomcat并发优化和缓存优化
    在配置hibernate.cfg.xml时需指定使用数据库的方言:
  • 原文地址:https://www.cnblogs.com/lcywuwuwu/p/14040597.html
Copyright © 2011-2022 走看看