Java反射机制基础详解

Java反射机制基础详解

Java反射机制是指在运行状态中,对于任意一个类都能够知道这个类的所有属性和方法,在运行时刻可以调用任意一个方法或者访问任意一个属性,这种方法称之为反射机制。

反射机制主要涉及三个类:Class,Constructor和Method。

Class类

在Java反射机制中,Class是反射机制的根源,它代表了被加载进内存中的类。Class中提供了获取类属性、方法、构造方法等的一系列方法。

获取Class对象的方式

1.通过对象获取

例如,使用以下代码获取String类的Class对象:

String str = "hello world";
Class<? extends String> clazz = str.getClass();

2.通过类获取

例如,使用以下代码获取String类的Class对象:

Class<String> clazz = String.class;

3.通过Class.forName()方法获取

例如,使用以下代码获取String类的Class对象:

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

获取类的属性

以下代码可以获取指定类的所有属性:

Field[] fields = clazz.getDeclaredFields();

获取类的方法

以下代码可以获取指定类的所有方法:

Method[] methods = clazz.getDeclaredMethods();

获取类的构造方法

以下代码可以获取指定类的所有构造方法:

Constructor<?>[] constructors = clazz.getDeclaredConstructors();

Constructor类

Constructor是反射机制中的一个类,它用于描述类的构造方法,Constructor对象用于创建新的类实例。

创建新的类实例

以下代码可以使用Constructor类的newInstance()方法创建一个新的类实例:

Constructor<?> constructor = clazz.getDeclaredConstructor();
Object instance = constructor.newInstance();

Method类

Method是反射机制中的一个类,它用于描述类的方法。

调用指定的方法

以下代码可以使用Method类的invoke()方法调用指定的方法:

Method method = clazz.getDeclaredMethod("methodName", paramTypes);
Object result = method.invoke(instance, args);

其中,methodName是方法名,paramTypes是方法参数类型数组,instance是该方法所在类的实例,args是参数数组。如果该方法是静态方法,则instance可以设为null。

示例

示例一

public class Person {
    private String name;
    private Integer age;
    public Person(String name, Integer age) {
        this.name = name;
        this.age = age;
    }
    public String getName() {
        return name;
    }
    public Integer getAge() {
        return age;
    }
}

public class Main {
    public static void main(String[] args) throws Exception {
        Class<?> clazz = Person.class;
        Constructor<?> constructor = clazz.getDeclaredConstructor(String.class, Integer.class);
        Object person = constructor.newInstance("张三", 20);
        Method getName = clazz.getDeclaredMethod("getName");
        String name = (String)getName.invoke(person);
        System.out.println("姓名:" + name);
        Method getAge = clazz.getDeclaredMethod("getAge");
        Integer age = (Integer)getAge.invoke(person);
        System.out.println("年龄:" + age);
    }
}

运行结果:

姓名:张三
年龄:20

示例二

public class Math {
    public static int add(int a, int b) {
        return a + b;
    }
    public static int sub(int a, int b) {
        return a - b;
    }
}

public class Main {
    public static void main(String[] args) throws Exception {
        Class<?> clazz = Math.class;
        Method add = clazz.getDeclaredMethod("add", int.class, int.class);
        int result1 = (int)add.invoke(null, 1, 2);
        System.out.println("1 + 2 = " + result1);
        Method sub = clazz.getDeclaredMethod("sub", int.class, int.class);
        int result2 = (int)sub.invoke(null, 5, 3);
        System.out.println("5 - 3 = " + result2);
    }
}

运行结果:

1 + 2 = 3
5 - 3 = 2

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Java反射机制基础详解 - Python技术站

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

相关文章

  • java 实现反射 json动态转实体类–fastjson

    Java中的反射是一种可以在运行时动态获取类的信息的机制。而fastjson则是一种常用的Java JSON 库,它支持将JSON字符串快速地转换为Java对象,以及将Java对象快速地序列化为JSON字符串。下面将详细介绍如何使用Java反射结合fastjson实现JSON字符串到Java对象的转换。 1. 添加依赖接口 我们需要在项目中添加fastjso…

    Java 2023年5月26日
    00
  • 序列化实现对象的拷贝

    提到拷贝,大家第一时间想到的可能都是克隆模式的深克隆,因为这个模式在面试中出现的机率非常高,同时实现的方式也比较容易:对象的类实现Cloneable接口并且重写clone()方法即可。但是在实际情况中克隆模式有时候其实并不适合用来拷贝对象,因为如果有很多的实体类都需要拷贝,这个时候难道把这些实体类全都实现克隆模式?这是不提倡的,这个时候可以使用序列化方式来实…

    Java 2023年4月19日
    00
  • Java ArrayList扩容机制原理深入分析

    Java ArrayList扩容机制原理深入分析 在 Java 中,ArrayList 是一种动态数组,它可以自动扩容以适应数据的增长。了解 ArrayList 扩容机制的原理,有助于我们更好地理解和使用 ArrayList,提高代码效率。 ArrayList 扩容机制 ArrayList 内部使用数组来存储元素,当向 ArrayList 中添加元素时,如果…

    Java 2023年5月26日
    00
  • spring boot 与kafka集成的示例代码

    下面就给您讲解Spring Boot与Kafka集成的示例代码攻略。 1. 引入依赖 首先,在pom.xml文件中添加Kafka相关的依赖: <!–kafka–> <dependency> <groupId>org.springframework.kafka</groupId> <artifactId…

    Java 2023年5月20日
    00
  • 在Java中使用基本的正则表达式

    下面就详细讲解“在Java中使用基本的正则表达式”的完整攻略。正则表达式是一种强大的文本匹配工具,可以用来搜索、置换和提取字符串中的特定字符或模式。Java可以使用基本的正则表达式实现这些功能。 1. 正则表达式的语法 正则表达式由普通字符(例如字母、数字等)和特殊字符组成。特殊字符通常由反斜线转义。以下是一些重要的特殊字符: 单个字符 .:匹配任何字符(除…

    Java 2023年5月27日
    00
  • Java实现多项式除法的代码示例

    当我们需要将多项式 $P(x)$ 除以 $Q(x)$,得到商式 $S(x)$ 和余式 $R(x)$,其中 $P(x)$,$Q(x)$,$S(x)$ 和 $R(x)$ 均为多项式,我们可以使用 Java 来实现多项式除法。下面是 Java 实现多项式除法的代码示例: 1. 实现思路 Java 实现多项式除法的思路是利用多项式的数据结构,通过对多项式进行简化转换…

    Java 2023年5月19日
    00
  • 详解JavaEE使用过滤器实现登录(用户自动登录 安全登录 取消自动登录黑用户禁止登录)

    详解JavaEE使用过滤器实现登录 什么是过滤器 在网络开发中,过滤器是一种能够截取并处理请求和响应的功能组件。过滤器可以修改请求,修改响应内容并可以过滤/拦截请求和响应。使用过滤器可以在不影响原来的请求和响应方式的情况下增加一些自定义的操作,使得整个系统的设计更加灵活。 怎样使用过滤器实现登录 1. 过滤器的实现 过滤器需要实现Filter接口,接口中有三…

    Java 2023年6月15日
    00
  • mvc实现图片验证码功能

    MVC实现图片验证码功能 在Web应用程序中,图片验证码是一种常见的安全机制,用于防止机器人或恶意用户自动化攻击。在本文中,我们将介绍如何使用MVC框架来实现图片验证码功能。 步骤 以下是实现图片验证码功能的步骤: 创建一个Controller类,用于处理请求并生成验证码图片。 创建一个View类,用于显示验证码图片。 创建一个Model类,用于生成验证码字…

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