JAVA编程不能不知道的反射用法总结

yizhihongxing

JAVA编程不能不知道的反射用法总结

什么是反射

反射是Java中的一种特性,它允许程序在运行时检查和操作对象的属性、方法和构造函数。在Java中,可以使用java.lang.reflect包中的类实现反射。

反射用法

获取Class对象

在Java中,每个类都有一个唯一的Class对象,它保存了与类有关的信息。可以通过下面的方法获取某个类的Class对象:

Class clazz = MyClass.class;
Class clazz = myObject.getClass();
Class clazz = Class.forName("com.example.MyClass");

上述代码中,MyClass代表类名,myObject是一个实例化的对象,"com.example.MyClass"是类的全限定名。例如,Class clazz = String.class;获取了String这个类的Class对象。

获取类的属性

可以使用getFields()、getDeclaredFields()等方法获取类的属性。getFields()获取类的公共字段(public修饰),getDeclaredFields()获取类中所有的字段。

Field[] fields = MyClass.class.getFields();
for (Field field : fields) {
    System.out.println(field.getName());
}

Field[] fields = MyClass.class.getDeclaredFields();
for (Field field : fields) {
    System.out.println(field.getName());
}

获取类的方法

同样可以使用getMethods()、getDeclaredMethods()等方法获取类的方法。getMethods()获取类的公共方法,getDeclaredMethods()获取类中定义的所有方法。

Method[] methods = MyClass.class.getMethods();
for (Method method : methods) {
    System.out.println(method.getName());
}

Method[] methods = MyClass.class.getDeclaredMethods();
for (Method method : methods) {
    System.out.println(method.getName());
}

实例化对象

实例化对象的方式有两种,一种是通过Class的newInstance()方法,另一种是通过Constructor的newInstance()方法。

MyClass obj1 = MyClass.class.newInstance();

Constructor<MyClass> constructor = MyClass.class.getConstructor(String.class);
MyClass obj2 = constructor.newInstance("foo");

调用对象的方法和属性

可以通过Method的invoke()方法调用对象的方法,通过Field的get()和set()方法获取和设置对象的属性。

Method method = MyClass.class.getMethod("sayHello");
Object result = method.invoke(myObject);

Field field = MyClass.class.getField("name");
Object value = field.get(myObject);    //获取值
field.set(myObject, "New Name");      //设置值

示例说明

示例一

假设有一个Person类,其中包含name和age属性,以及getName()和setName(String name)方法。可以使用以下代码获取name属性的值并调用setName()方法修改属性值:

public class Person {
    private String name;
    private int age;
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
}

Class clazz = Person.class;
Person p = (Person) clazz.newInstance();
Field field = clazz.getDeclaredField("name");
field.setAccessible(true);  //设置为可访问
field.set(p, "John");       //设置name属性值
Method method = clazz.getDeclaredMethod("getName");
String name = (String) method.invoke(p);  //调用getName()方法获取属性值
System.out.println(name);   //输出"John"

示例二

假设有一个Car类,其中包含startEngine()和stopEngine()方法。可以使用以下代码获取Car类的实例并调用startEngine()方法。

public class Car {
    public void startEngine() {
        System.out.println("Engine started");
    }
    public void stopEngine() {
        System.out.println("Engine stopped");
    }
}

Class clazz = Car.class;
Car car = (Car) clazz.newInstance();
Method method = clazz.getDeclaredMethod("startEngine");
method.invoke(car);   //调用startEngine()方法,输出"Engine started"

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:JAVA编程不能不知道的反射用法总结 - Python技术站

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

相关文章

  • java的Hibernate框架报错“InvalidStateException”的原因和解决方法

    当使用Java的Hibernate框架时,可能会遇到“InvalidStateException”错误。这个错误通常是由于以下原因之一引起的: 实体状态错误:如果实体状态错误,则可能会出现此错误。在这种情况下,需要检查实体状态并进行必要的更改。 数据库连接问题:如果数据库连接出现问题,则可能会出现此错误。在这种情况下,需要检查数据库连接并解决连接问题。 以下…

    Java 2023年5月4日
    00
  • Tomcat中使用ipv6地址的示例代码

    下面是Tomcat中使用IPv6地址的示例代码的攻略: 确认Tomcat版本 首先需要确认Tomcat的版本,因为不同版本的Tomcat对IPv6的支持可能会有所不同。确保使用的Tomcat版本是7.0或更高版本,这些版本都支持IPv6地址。 配置server.xml 编辑Tomcat的配置文件server.xml,在 <Connector> 元…

    Java 2023年5月19日
    00
  • 使用jQuery.form.js/springmvc框架实现文件上传功能

    下面是关于“使用jQuery.form.js/SpringMVC框架实现文件上传功能”的完整攻略,包含两个示例说明。 使用jQuery.form.js/SpringMVC框架实现文件上传功能 在本文中,我们将介绍如何使用jQuery.form.js和SpringMVC框架实现文件上传功能。 步骤1:添加依赖 首先,我们需要在pom.xml中添加SpringM…

    Java 2023年5月17日
    00
  • Java java.lang.InstantiationException异常案例详解

    Java java.lang.InstantiationException异常案例详解 什么是 java.lang.InstantiationException 异常? java.lang.InstantiationException 是 Java 异常类的一种,通常是由于实例化一个抽象类或没有公共构造方法的类而导致的。当一个类被实例化时,Java 实际上会…

    Java 2023年5月27日
    00
  • Java中内存异常StackOverflowError与OutOfMemoryError详解

    Java中内存异常StackOverflowError与OutOfMemoryError详解 StackOverflowError的产生原因及解决方案 StackOverflowError StackOverflowError是由于单个线程或者递归过深,导致函数栈溢出造成的内存溢出异常。当一个方法调用自身方法达到一定次数时会引起StackOverflowEr…

    Java 2023年5月27日
    00
  • SpringMVC注解@RequestParam方法原理解析

    以下是关于“SpringMVC注解@RequestParam方法原理解析”的完整攻略,其中包含两个示例。 SpringMVC注解@RequestParam方法原理解析 SpringMVC是一个基于Java的Web框架,它可以帮助我们快速开发Web应用程序。@RequestParam是SpringMVC中的一个注解,它可以帮助我们获取HTTP请求中的参数。本文…

    Java 2023年5月17日
    00
  • 最小树形图模板朱刘算法分享

    最小树形图模板朱刘算法分享 最小树形图(Minimum Spanning Arborescence)是有向图的一种特殊的生成树,它包含了图中所有的点且仅有一个点入度为0(源点)。朱刘算法是一种求解最小树形图的算法,时间复杂度为$O(VE)$。 以下是朱刘算法的完整攻略: 1. 算法原理 朱刘算法基于”缩点”思想和“基环树”的性质,在每一个生成树已经连出来的点…

    Java 2023年5月19日
    00
  • 深入了解Java线程池的原理使用及性能优化

    深入了解Java线程池的原理、使用及性能优化 Java线程池是实现多线程编程的重要机制。它能够有效地控制线程数量,优化资源利用率和性能。本攻略将详细讲解Java线程池的原理、使用和性能优化方法。 线程池原理 线程池是一个线程队列,用于管理和调度线程。它包含一组线程,用于执行任务。线程池中的每个线程都可以从任务队列中获取待执行的任务,并执行它。当一个任务完成,…

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