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);
        
    }

}
相关文章
|
2月前
|
XML Java 编译器
Java学习十六—掌握注解:让编程更简单
Java 注解(Annotation)是一种特殊的语法结构,可以在代码中嵌入元数据。它们不直接影响代码的运行,但可以通过工具和框架提供额外的信息,帮助在编译、部署或运行时进行处理。
91 43
Java学习十六—掌握注解:让编程更简单
|
21天前
|
Java 大数据 API
14天Java基础学习——第1天:Java入门和环境搭建
本文介绍了Java的基础知识,包括Java的简介、历史和应用领域。详细讲解了如何安装JDK并配置环境变量,以及如何使用IntelliJ IDEA创建和运行Java项目。通过示例代码“HelloWorld.java”,展示了从编写到运行的全过程。适合初学者快速入门Java编程。
|
2月前
|
存储 SQL 小程序
JVM知识体系学习五:Java Runtime Data Area and JVM Instruction (java运行时数据区域和java指令(大约200多条,这里就将一些简单的指令和学习))
这篇文章详细介绍了Java虚拟机(JVM)的运行时数据区域和JVM指令集,包括程序计数器、虚拟机栈、本地方法栈、直接内存、方法区和堆,以及栈帧的组成部分和执行流程。
36 2
JVM知识体系学习五:Java Runtime Data Area and JVM Instruction (java运行时数据区域和java指令(大约200多条,这里就将一些简单的指令和学习))
|
29天前
|
JavaScript Java 项目管理
Java毕设学习 基于SpringBoot + Vue 的医院管理系统 持续给大家寻找Java毕设学习项目(附源码)
基于SpringBoot + Vue的医院管理系统,涵盖医院、患者、挂号、药物、检查、病床、排班管理和数据分析等功能。开发工具为IDEA和HBuilder X,环境需配置jdk8、Node.js14、MySQL8。文末提供源码下载链接。
|
2月前
|
存储 Java
[Java]反射
本文详细介绍了Java反射机制的基本概念、使用方法及其注意事项。首先解释了反射的定义和类加载过程,接着通过具体示例展示了如何使用反射获取和操作类的构造方法、方法和变量。文章还讨论了反射在类加载、内部类、父类成员访问等方面的特殊行为,并提供了通过反射跳过泛型检查的示例。最后,简要介绍了字面量和符号引用的概念。全文旨在帮助读者深入理解反射机制及其应用场景。
22 0
[Java]反射
|
2月前
|
安全 Java 测试技术
🌟Java零基础-反射:从入门到精通
【10月更文挑战第4天】本文收录于「滚雪球学Java」专栏,专业攻坚指数级提升,希望能够助你一臂之力,帮你早日登顶实现财富自由🚀;同时,欢迎大家关注&&收藏&&订阅!持续更新中,up!up!up!!
26 2
|
2月前
|
小程序 Oracle Java
JVM知识体系学习一:JVM了解基础、java编译后class文件的类结构详解,class分析工具 javap 和 jclasslib 的使用
这篇文章是关于JVM基础知识的介绍,包括JVM的跨平台和跨语言特性、Class文件格式的详细解析,以及如何使用javap和jclasslib工具来分析Class文件。
49 0
JVM知识体系学习一:JVM了解基础、java编译后class文件的类结构详解,class分析工具 javap 和 jclasslib 的使用
|
2月前
|
前端开发 Java 应用服务中间件
Javaweb学习
【10月更文挑战第1天】Javaweb学习
33 2
|
2月前
|
存储 安全 Java
【用Java学习数据结构系列】探索顺序表和链表的无尽秘密(附带练习唔)pro
【用Java学习数据结构系列】探索顺序表和链表的无尽秘密(附带练习唔)pro
25 3
|
2月前
|
存储 安全 Java
【用Java学习数据结构系列】探索栈和队列的无尽秘密
【用Java学习数据结构系列】探索栈和队列的无尽秘密
32 2