Java反射机制基础详解

yizhihongxing

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中ReentrantLock4种常见的坑

    当使用Java中的ReentrantLock时,我们需要注意一些常见的问题。 1. 必须使用try-finally语句块 在使用ReentrantLock时,在临界区代码执行完毕后,必须释放锁,否则可能导致其他线程无法进入临界区。同时,在代码执行过程中,可能会抛出异常或执行return语句,这些情况也需要确保锁被正确释放。因此,我们需要使用try-final…

    Java 2023年5月27日
    00
  • Java 格式化输出JSON字符串的2种实现操作

    接下来我将详细讲解“Java 格式化输出JSON字符串的2种实现操作”的完整攻略。 1. JSON格式化输出实现方式 在Java中格式化输出JSON字符串有很多种方式,这里将介绍最常用的两种方式:第一种是使用JSON API手动创建JSON字符串,第二种是使用Jackson、Gson等库自动序列化为JSON字符串。 1.1 使用JSON API手动创建JSO…

    Java 2023年5月26日
    00
  • Java之Algorithm_analysis案例详解

    Java之Algorithm_analysis案例详解 本篇文章旨在介绍Java中算法分析的相关知识点和应用案例,并详细解释如何应用该知识点解决实际问题。文章包括以下内容: 算法分析的基本概念 时间复杂度和空间复杂度的定义及其度量 案例:冒泡排序 案例:二分查找 算法分析的基本概念 算法是指完成特定任务的一系列有序步骤,分为有限步骤和无限步骤两种。算法分析则…

    Java 2023年5月26日
    00
  • 如何在JDK 9中更简洁使用 try-with-resources 语句

    在 JDK 9 中,你可以更加简洁地使用 try-with-resources 语句。下面,我们来一步步讲解具体的步骤。 1. JDK 9 try-with-resources 简化语法 在 JDK 9 中,简化了 try-with-resources 语法。以前,你需要在 try 语句中申明一个资源,像这样: try (SomeResource resou…

    Java 2023年5月27日
    00
  • java安全编码指南之:Mutability可变性详解

    Java安全编码指南之:Mutability可变性详解 在Java编程中,可变性(Mutability)是一个非常重要的概念。可变性指的是对象在创建之后是否可被修改。如果一个对象是可变的,那么它的状态可以被修改,而不可变对象的状态则不能被修改。在Java编程中,一些安全漏洞与可变性有关,因此在编写Java代码时,我们需要特别注意可变性问题。 不可变对象的优点…

    Java 2023年5月20日
    00
  • 详解springmvc之json数据交互controller方法返回值为简单类型

    下面是详解springmvc之json数据交互controller方法返回值为简单类型的攻略。 什么是Spring MVC? Spring MVC是一个基于Java的Web框架,用于开发Web应用程序。它使用Java Servlet API和为其定义的JavaServer Pages(JSP)规范来实现Web组件。 什么是JSON? JSON(JavaScr…

    Java 2023年5月26日
    00
  • java的Hibernate框架报错“TypeMismatchException”的原因和解决方法

    当使用Java的Hibernate框架时,可能会遇到“TypeMismatchException”错误。这个错误通常是由于以下原因之一引起的: 数据类型不匹配:如果您的数据类型不匹配,则可能会出现此错误。在这种情况下,需要检查您的数据类型以解决此问题。 数据库表结构不匹配:如果您的数据库表结构不匹配,则可能会出现此错误。在这种情况下,需要检查您的数据库表结构…

    Java 2023年5月4日
    00
  • Java计算一个数加上100是完全平方数,加上168还是完全平方数

    题目简述:Java计算一个数加上100是完全平方数,加上168还是完全平方数 根据题目中的描述,可以得到以下两个方程:1. n + 100 = x^22. n + 168 = y^2 其中,n表示待求解的数,x和y分别是n加上100和n加上168后所对应的完全平方数。 这两个方程可以同时求解,步骤如下: 首先,对于x^2和y^2,我们可以利用Java的Mat…

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