Java学习:反射

简介: 反射使用反射可以直接获取class字节码文件中的类型、属性、方法。演示代码:新建一个名为User的类作为反射的操作对象public class User { private int id; private String name; private String pa...

反射

使用反射可以直接获取class字节码文件中的类型、属性、方法。

演示代码:

新建一个名为User的类作为反射的操作对象

public class User {
    private int id;
    private String name;
    private String password;
    public User() {
    
    }
    /**
     * @return the id
     */
    public int getId() {
        return id;
    }
    /**
     * @return the name
     */
    public String getName() {
        return name;
    }
    /**
     * @return the password
     */
    public String getPassword() {
        return password;
    }
    /**
     * @param id the id to set
     */
    public void setId(int id) {
        this.id = id;
    }
    /**
     * @param name the name to set
     */
    public void setName(String name) {
        this.name = name;
    }
    /**
     * @param password the password to set
     */
    public void setPassword(String password) {
        this.password = password;
    }
    /* (non-Javadoc)
     * @see java.lang.Object#toString()
     */
    @Override
    public String toString() {
        return "User [id=" + id + ", name=" + name + ", password=" + password + "]";
    }
    
    
}

演示

获取类

Object u = new User();
Class class1 = u.getClass();

获取类名

class1.getName()

获取类访问权限

int modifier = class1.getModifiers();
boolean flag = Modifier.isPublic(modifier);
System.out.println("是public?: "+flag);

属性

获取类所有属性
访问权限私有的也可以获取到

Field[] arr = class1.getDeclaredFields();
for (Field field:arr) {
    System.out.println ("类中的属性:" + field);
}

获取类所有属性的值
私有属性默认无法获取,但是可以通过不检查访问权限来直接获取。

// 获取所有属性的值
for (Field field:arr) {
    // 不检查访问权限
    field.setAccessible(true);
    // 获取u对象中field的值
    Object o = field.get(u);
    System.out.println("类中的属性值:" +o);
}

指定属性名获取属性

Field f = class1.getDeclaredField("name");
f.setAccessible(true);
f.set(u, "张三");
Object o = f.get(u);
System.out.println("name: " + o);

方法

获取所有方法(包含从父类继承的方法)

Method[] allMethods = class1.getMethods();
System.out.println("类的所有方法:");
for (Method method:allMethods) {
    System.out.println(method);
}

获取类自己的方法

Method[] onlyMethods = class1.getDeclaredMethods();
for (Method method:onlyMethods) {
    System.out.println(method);
}

调用无参带返回值方法

Method method2 = class1.getDeclaredMethod("getName");
String str = (String)(method2.invoke(u));
System.out.println ("返回值:"+ str);

调用有参无返回值方法

Method method = class1.getDeclaredMethod("setName", String.class);
method.invoke(u, "李四");

完整演示代码:

import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.lang.reflect.Modifier;

public class ReflectTest {
    public static void main(String[] args) throws IllegalArgumentException, IllegalAccessException, NoSuchFieldException, SecurityException, NoSuchMethodException, InvocationTargetException {
        Object u = new User();
        // 获取到User的类
        Class class1 = u.getClass();
        
        System.out.println("类名:"+class1.getName());
        
        // 获取类访问权限
        int modifier = class1.getModifiers();
        boolean flag = Modifier.isPublic(modifier);
        System.out.println("是public?: "+flag);
        
        // 获取所有属性
        Field[] arr = class1.getDeclaredFields();
        for (Field field:arr) {
            System.out.println ("类中的属性:" + field);
        }
        // 获取所有属性的值
        for (Field field:arr) {
            // 不检查访问权限
            field.setAccessible(true);
            // 获取u对象中field的值
            Object o = field.get(u);
            System.out.println("类中的属性值:" +o);
        }
        
        // 指定字段名称获取属性
        Field f = class1.getDeclaredField("name");
        f.setAccessible(true);
        f.set(u, "张三");
        Object o = f.get(u);
        System.out.println("name: " + o);
        
        // 获取所有方法 (包含继承方法)
        Method[] allMethods = class1.getMethods();
        System.out.println("类的所有方法:");
        for (Method method:allMethods) {
            System.out.println(method);
        }
        // 获取当前类的自己的方法
        Method[] onlyMethods = class1.getDeclaredMethods();
        for (Method method:onlyMethods) {
            System.out.println(method);
        }
        
        // 调用有参方法
        Method method = class1.getDeclaredMethod("setName", String.class);
        method.invoke(u, "李四");
        
        // 调用无参有返回值方法
        Method method2 = class1.getDeclaredMethod("getName");
        String str = (String)(method2.invoke(u));
        System.out.println ("返回值:"+ str);
        
    }

}
相关文章
|
1天前
|
Java 数据库连接 数据库
【潜意识Java】深度分析黑马项目《苍穹外卖》在Java学习中的重要性
《苍穹外卖》项目对Java学习至关重要。它涵盖了用户管理、商品查询、订单处理等模块,涉及Spring Boot、MyBatis、Redis等技术栈。
18 4
|
1天前
|
前端开发 Java 数据库连接
【潜意识Java】深度解读JavaWeb开发在Java学习中的重要性
深度解读JavaWeb开发在Java学习中的重要性
18 4
|
1天前
|
存储 移动开发 算法
【潜意识Java】Java基础教程:从零开始的学习之旅
本文介绍了 Java 编程语言的基础知识,涵盖从简介、程序结构到面向对象编程的核心概念。首先,Java 是一种高级、跨平台的面向对象语言,支持“一次编写,到处运行”。接着,文章详细讲解了 Java 程序的基本结构,包括包声明、导入语句、类声明和 main 方法。随后,深入探讨了基础语法,如数据类型、变量、控制结构、方法和数组。此外,还介绍了面向对象编程的关键概念,例如类与对象、继承和多态。最后,针对常见的编程错误提供了调试技巧,并总结了学习 Java 的重要性和方法。适合初学者逐步掌握 Java 编程。
10 1
|
25天前
|
Java 数据库连接 Spring
反射-----浅解析(Java)
在java中,我们可以通过反射机制,知道任何一个类的成员变量(成员属性)和成员方法,也可以堆任何一个对象,调用这个对象的任何属性和方法,更进一步我们还可以修改部分信息和。
|
3月前
|
XML Java 编译器
Java学习十六—掌握注解:让编程更简单
Java 注解(Annotation)是一种特殊的语法结构,可以在代码中嵌入元数据。它们不直接影响代码的运行,但可以通过工具和框架提供额外的信息,帮助在编译、部署或运行时进行处理。
113 43
Java学习十六—掌握注解:让编程更简单
|
2月前
|
监控 Java
Java基础——反射
本文介绍了Java反射机制的基本概念和使用方法,包括`Class`类的使用、动态加载类、获取方法和成员变量信息、方法反射操作、以及通过反射了解集合泛型的本质。同时,文章还探讨了动态代理的概念及其应用,通过实例展示了如何利用动态代理实现面向切面编程(AOP),例如为方法执行添加性能监控。
|
3月前
|
存储 SQL 小程序
JVM知识体系学习五:Java Runtime Data Area and JVM Instruction (java运行时数据区域和java指令(大约200多条,这里就将一些简单的指令和学习))
这篇文章详细介绍了Java虚拟机(JVM)的运行时数据区域和JVM指令集,包括程序计数器、虚拟机栈、本地方法栈、直接内存、方法区和堆,以及栈帧的组成部分和执行流程。
53 2
JVM知识体系学习五:Java Runtime Data Area and JVM Instruction (java运行时数据区域和java指令(大约200多条,这里就将一些简单的指令和学习))
|
2月前
|
Java 大数据 API
14天Java基础学习——第1天:Java入门和环境搭建
本文介绍了Java的基础知识,包括Java的简介、历史和应用领域。详细讲解了如何安装JDK并配置环境变量,以及如何使用IntelliJ IDEA创建和运行Java项目。通过示例代码“HelloWorld.java”,展示了从编写到运行的全过程。适合初学者快速入门Java编程。
|
2月前
|
Java
Java的反射
Java的反射。
43 2
|
2月前
|
JavaScript Java 项目管理
Java毕设学习 基于SpringBoot + Vue 的医院管理系统 持续给大家寻找Java毕设学习项目(附源码)
基于SpringBoot + Vue的医院管理系统,涵盖医院、患者、挂号、药物、检查、病床、排班管理和数据分析等功能。开发工具为IDEA和HBuilder X,环境需配置jdk8、Node.js14、MySQL8。文末提供源码下载链接。