黑马程序员——反射

本文深入讲解Java反射机制,包括Class类、Constructor类、Field类及Method类的基本使用方法。介绍了如何通过不同方式获取字节码文件对象,以及如何利用反射机制创建对象、获取和设置字段值、调用方法等。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

——- android培训java培训、期待与您交流! ———-



黑马程序员——反射

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

动态获取类中信息,就是java反射。可以理解为对类的解剖。

  • 反射的好处
    • 大大提高了应用程序的扩展性

Class类

要想要对字节码文件进行解剖,必须要有字节码文件对象。

获取字节码文件对象三种方式:

  1. Object类中的getClass()方法的。 想要用这种方式,必须要明确具体的类,并创建对象。

    public static void getClassObject_1() {
        Person p = new Person();
        Class clazz = p.getClass();
    
        Person p1 = new Person();
        Class clazz1 = p1.getClass();
    
        System.out.println(clazz == clazz1);
    }
  2. 任何数据类型都具备一个静态的属性.class来获取其对应的Class对象。 相对简单,但是还是要明确用到类中的静态成员。还是不够扩展。

    public static void getClassObject_2() {
    
        Class clazz = Person.class;
    
        Class clazz1 = Person.class;
        System.out.println(clazz == clazz1);
    }
  3. 只要通过给定的类的 字符串名称就可以获取该类,更为扩展。 可是用Class类中的方法完成。该方法就是forName。 这种方式只要有名称即可,更为方便,扩展性更强。

    public static void getClassObject_3() throws ClassNotFoundException {
    
        String className = "cn.itcast.bean.Person";
    
        Class clazz = Class.forName(className);
    
        System.out.println(clazz);
    }

Constructor类

Constructor代表某个类的构造方法。

  • 获取构造方法:
    • 得到这个类的所有构造方法:
      • Constructor[] cons = Class.forName("cn.itheima.Person").getConstructors();
    • 获取某一个构造方法:
      • Constructor con = Person.class.getConstructor(String.class, int.class);
  • 创建实例对象:
    • Person p = (Person) con.newInstance("lisi", 30);

注:

  1. 创建实例时newInstance方法中的参数列表必须与获取Constructor的方法getConstructor方法中的参数列表一致。
  2. newInstance():构造出一个实例对象,每调用一次就构造一个对象。
  3. 利用Constructor类来创建类实例的好处是可以指定构造函数,而Class类只能利用无参构造函数创建类实例对象。

示例:

// 通过Constructor对象来创建类实例方法
public static void createPersonClass_2() throws Exception {
    // 获取Person类的Class对象
    String className = "cn.itheima.Person";
    Class clazz = Class.forName(className);
    // Class clazz=Person.class;

    // 获取指定构造函数的类实例
    Constructor con = clazz.getConstructor(String.class, int.class);
    Person p = (Person) con.newInstance("lisi", 30);
    System.out.println(p.toString());
    }

Field类

Field类代表某个类中一个成员变量

方法

  • Field getField(String s); // 只能获取公有和父类中公有
  • Field getDeclaredField(String s); // 获取该类中任意成员变量,包括私有
  • setAccessible(ture); // 如果是私有字段,要先将该私有字段进行取消权限检查的能力。也称暴力访问。
  • set(Object obj, Object value); // 将指定对象变量上此Field对象表示的字段设置为指定的新值。
  • Object get(Object obj); // 返回指定对象上Field表示的字段的值。

示例:

package cn.itcast.reflect.demo;

import java.lang.reflect.Field;

public class ReflectDemo3 {

    /**
     * @param args
     * @throws Exception
     */
    public static void main(String[] args) throws Exception {

        getFieldDemo();

    }

    /*
     * 获取字节码文件中的字段。
     */
    public static void getFieldDemo() throws Exception {

        Class clazz = Class.forName("cn.itcast.bean.Person");

        Field field = null;// clazz.getField("age");//只能获取公有的,

        field = clazz.getDeclaredField("age");// 只获取本类,但包含私有。

        // 对私有字段的访问取消权限检查。暴力访问。
        field.setAccessible(true);

        Object obj = clazz.newInstance();

        field.set(obj, 89);

        Object o = field.get(obj);

        System.out.println(o);

    }

}

Method类

Method类代表某个类中的一个成员方法。

方法

  • Method[] getMethods(); // 只获取公共和父类中的方法。
  • Method[] getDeclaredMethods(); // 获取本类中包含私有。
  • Method getMethod("方法名", 参数.class(如果是空参可以写null));
  • Object invoke(Object obj, 参数); // 调用方法。如果方法是静态,invoke方法中的对象参数可以为null。

示例:

package cn.itcast.reflect.demo;

import java.lang.reflect.Constructor;
import java.lang.reflect.Method;

public class ReflectDemo4 {

    public ReflectDemo4() {
    }

    /**
     * @param args
     * @throws Exception
     */
    public static void main(String[] args) throws Exception {

        getMethodDemo_3();

    }

    public static void getMethodDemo_3() throws Exception {

        Class clazz = Class.forName("cn.itcast.bean.Person");

        Method method = clazz.getMethod("paramMethod", String.class, int.class);

        Object obj = clazz.newInstance();

        method.invoke(obj, "小强", 89);

    }

    public static void getMethodDemo_2() throws Exception {

        Class clazz = Class.forName("cn.itcast.bean.Person");

        Method method = clazz.getMethod("show", null);// 获取空参数一般方法。

        // Object obj = clazz.newInstance();
        Constructor constructor = clazz.getConstructor(String.class, int.class);
        Object obj = constructor.newInstance("小明", 37);

        method.invoke(obj, null);

    }

    /*
     * 获取指定Class中的所有公共函数。
     */
    public static void getMethodDemo() throws Exception {

        Class clazz = Class.forName("cn.itcast.bean.Person");

        Method[] methods = clazz.getMethods();// 获取的都是公有的方法。
        methods = clazz.getDeclaredMethods();// 只获取本类中所有方法,包含私有。
        for (Method method : methods) {
            System.out.println(method);
        }

    }

}
资源下载链接为: https://pan.quark.cn/s/22ca96b7bd39 在 IT 领域,文档格式转换是常见需求,尤其在处理多种文件类型时。本文将聚焦于利用 Java 技术栈,尤其是 Apache POI 和 iTextPDF 库,实现 doc、xls(涵盖 Excel 2003 及 Excel 2007+)以及 txt、图片等格式文件向 PDF 的转换,并实现在线浏览功能。 先从 Apache POI 说起,它是一个强大的 Java 库,专注于处理 Microsoft Office 格式文件,比如 doc 和 xls。Apache POI 提供了 HSSF 和 XSSF 两个 API,其中 HSSF 用于读写老版本的 BIFF8 格式(Excel 97-2003),XSSF 则针对新的 XML 格式(Excel 2007+)。这两个 API 均具备读取和写入工作表、单元格、公式、样式等功能。读取 Excel 文件时,可通过创建 HSSFWorkbook 或 XSSFWorkbook 对象来打开相应格式的文件,进而遍历工作簿中的每个 Sheet,获取行和列数据。写入 Excel 文件时,创建新的 Workbook 对象,添加 Sheet、Row 和 Cell,即可构建新 Excel 文件。 再看 iTextPDF,它是一个用于生成和修改 PDF 文档的 Java 库,拥有丰富的 API。创建 PDF 文档时,借助 Document 对象,可定义页面尺寸、边距等属性来定制 PDF 外观。添加内容方面,可使用 Paragraph、List、Table 等元素将文本、列表和表格加入 PDF,图片可通过 Image 类加载插入。iTextPDF 支持多种字体和样式,可设置文本颜色、大小、样式等。此外,iTextPDF 的 TextRenderer 类能将 HTML、
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值