java基础学习笔记之反射

Java基础学习笔记之反射

什么是反射?

反射(Reflection)是Java被赋予的一种能力,它允许程序在运行时动态地获取某个类的成员变量、方法、构造方法等信息,并且可以调用对应的成员方法,这样可以大大提高代码的可扩展性和灵活度。

反射的三个重要类

Java反射是借助Java类库中的三个类来实现的:

  1. java.lang.Class:用于描述类的类,包含了类的成员变量、方法、构造方法等信息。
  2. java.lang.reflect.Method:用于描述类中的某个方法,包含了方法的参数类型、返回类型等信息。
  3. java.lang.reflect.Field:用于描述类中的某个成员变量,包含了变量的类型、值等信息。

反射的使用方法

获取Class对象

获取某个类的Class对象,主要有以下三种方法:

  1. 调用某个类的class属性:Class clazz = SomeClass.class;
  2. 调用某个类的静态方法forName():Class clazz = Class.forName("com.example.SomeClass");
  3. 调用某个实例对象的getClass()方法:Class clazz = someObject.getClass();

其中第三种方法只能用在已经有实例对象的情况下。

获取类的实例对象

获取某个类的实例对象,主要有以下两种方法:

  1. 调用Class对象的newInstance()方法:SomeClass obj = (SomeClass)clazz.newInstance();
  2. 调用Constructor对象的newInstance()方法:Constructor constructor = clazz.getConstructor(); SomeClass obj = (SomeClass)constructor.newInstance();

其中第二种方法可以在构造函数需要传递参数的情况下使用。

获取类的成员变量

获取类的成员变量,主要使用java.lang.reflect.Field类,可以通过Class对象的getField()或getDeclaredField()方法获取对应的Field对象。

public class SomeClass{
    public String name = "Jack";
    private int age = 20;
    protected boolean isMale = true;
    //...
}

Class clazz = SomeClass.class;
Field publicField = clazz.getField("name");
Field privateField = clazz.getDeclaredField("age");
Field protectedField = clazz.getDeclaredField("isMale");

获取类的方法

获取类的方法,主要使用java.lang.reflect.Method类,可以通过Class对象的getMethod()或getDeclaredMethod()方法获取对应的Method对象。

public class SomeClass{
    public void sayHello(String name){
        System.out.println("Hello, " + name);
    }
    private void sayGoodbye(){
        System.out.println("Goodbye!");
    }
    //...
}

Class clazz = SomeClass.class;
Method publicMethod = clazz.getMethod("sayHello", String.class);
Method privateMethod = clazz.getDeclaredMethod("sayGoodbye");

调用类的方法(共有方法和私有方法)

调用某个类的方法,可以使用Method对象的invoke()方法。

public class SomeClass{
    public void sayHello(String name){
        System.out.println("Hello, " + name);
    }
    private void sayGoodbye(){
        System.out.println("Goodbye!");
    }
    //...
}

Class clazz = SomeClass.class;
SomeClass obj = (SomeClass)clazz.newInstance();

//调用公有方法
Method publicMethod = clazz.getMethod("sayHello", String.class);
publicMethod.invoke(obj, "Jack");

//调用私有方法
Method privateMethod = clazz.getDeclaredMethod("sayGoodbye");
privateMethod.setAccessible(true); //设置私有方法可访问
privateMethod.invoke(obj);

示例1:使用反射生成并调用一个类的实例对象

public class SomeClass{
    public SomeClass(){
        System.out.println("SomeClass构造函数被调用");
    }
    //...
}

Class clazz = SomeClass.class;
SomeClass obj = (SomeClass)clazz.newInstance();
//输出:SomeClass构造函数被调用

示例2:使用反射调用StringBuilder类中的append方法

Class clazz = StringBuilder.class;
StringBuilder sb = new StringBuilder();

Method appendMethod = clazz.getMethod("append", String.class);
appendMethod.invoke(sb, "Hello, ");
appendMethod.invoke(sb, "world!");

System.out.println(sb.toString());
//输出:Hello, world!

总结

以上就是关于Java反射的介绍和使用方法,反射虽然灵活,在某些情况下确实可以解决类之间耦合问题,但同时会影响程序运行的性能。因此,在使用反射时要注意不要滥用,慎重思考。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:java基础学习笔记之反射 - Python技术站

(0)
上一篇 2023年5月26日
下一篇 2023年5月26日

相关文章

  • MyBatis如何实现多表查询(多对一、一对多)

    MyBatis 是一种优秀的持久层框架,它提供了一种灵活方便的方式来处理多表操作。多表查询中最常见的场景是多对一和一对多关系。接下来我们详细讲解 MyBatis 如何实现这两种关系的多表查询。 多对一查询 多对一查询通常是一个表中的多条数据对应另一个表中的一条数据。在 MyBatis 中实现多对一查询的步骤如下: 步骤一:建立实体类 我们需要建立两张表的实体…

    Java 2023年5月20日
    00
  • JavaEE在线人数管理系统

    JavaEE在线人数管理系统攻略 概述 本系统是基于JavaEE开发的在线人数管理系统,主要功能是实时展示当前在线用户数并记录历史在线人数信息。 技术栈 本系统主要采用了以下技术:- 后端框架:Spring框架- 数据库:MySQL- 前端框架:Bootstrap和jQuery- 服务器:Tomcat 实现步骤 步骤一:建立数据库 在MySQL中建立一个名为…

    Java 2023年5月24日
    00
  • spring mvc实现文件上传与下载功能

    Spring MVC实现文件上传与下载功能 Spring MVC是一个非常流行的Java Web框架,它提供了很多方便的功能,其中包括文件上传和下载。本文将详细讲解如何使用Spring MVC实现文件上传和下载功能,并提供两个示例来说明如何实现这一过程。 文件上传 文件上传是Web应用程序中常见的功能之一。Spring MVC提供了很多方便的类和注解来处理文…

    Java 2023年5月17日
    00
  • Java 编程中十个处理异常的建议

    Java 编程中十个处理异常的建议 对于 Java 程序员来说,异常处理是一项必不可少的技能。如何合理地处理异常,提高代码的健壮性和可维护性,是每个程序员都应该重视的问题。这里提供十个处理异常的建议,帮助大家更好地应对各种异常情况。 1. 避免捕获过于宽泛的异常 Java 中存在许多种异常类型,如 NullPointerException、ArrayInde…

    Java 2023年5月27日
    00
  • SpringBoot加载bean的八种方式总结

    SpringBoot加载Bean的八种方式总结 在使用SpringBoot时,我们常常需要加载Bean来完成各种任务。SpringBoot提供了多种方式来加载Bean,本文将对其进行总结。 1. 使用@ComponentScan自动扫描注解 @ComponentScan是Spring框架中常用的注解,它会自动扫描指定的包及其子包,将所有标记有@Compone…

    Java 2023年5月19日
    00
  • 对ArrayList和LinkedList底层实现原理详解

    对ArrayList和LinkedList底层实现原理详解 ArrayList 简介 ArrayList是基于动态数组实现的,其最大的特点就是可以随机访问,这也是数组的一个最大优点。另外,ArrayList支持在尾部快速添加元素的操作,当然,如果要在中间插入、删除元素,这是需要移动数组元素,所以操作速度会相对比较慢,并且,在ArrayList中,如果进行了大…

    Java 2023年5月26日
    00
  • 使用Visual Studio 2022开发前端的详细教程

    使用Visual Studio 2022开发前端的详细教程 什么是Visual Studio 2022? Visual Studio 2022是微软公司开发的一款集成开发环境(IDE),它可支持多种编程语言,包括C#、C++、JavaScript、TypeScript等。它既可用于web应用程序开发,也可用于桌面应用程序开发。 Visual Studio 2…

    Java 2023年6月16日
    00
  • jsp filter 过滤器功能与简单用法示例

    下面我将为你详细讲解“JSP Filter 过滤器功能与简单用法示例”的完整攻略。 1. JSP Filter 过滤器的概念 JSP Filter 是 JSP 技术中的一种过滤器,它可以以拦截器的方式截获请求,对请求进行过滤或者添加处理,再将请求交给被请求的资源处理,从而实现某些特定的功能和保障系统的安全性。 2. JSP Filter 过滤器的应用场景 J…

    Java 2023年6月15日
    00
合作推广
合作推广
分享本页
返回顶部