反射机制的知识

1.反射机制

静态语言:JAVA 和C++

反射:可以借助于反射API可以获取任何类的内部信息,并可以直接操作任意对象的内部属性、方法、泛型等。

实现获得Class类的方法有哪些:

  1. 类名.class
  2. Class.forName("类的绝对路径")
  3. 对象.getClass () 方法
  4. 包装类.type
package com.chapter02_注解和反射.reflection;

/**
 * @author Lenovo
 * @date 2024/3/12
 * @time 19:59
 * @project Chapter01_Java_多线程
 **/
public class TestReflection01 {

    public static void main(String[] args) throws ClassNotFoundException {

        //第一种方法 对象.getClass() 方法;
        Student student = new Student();
        System.out.println("名字是:"+student.name);
        Class<? extends Student> c1 = student.getClass();
        System.out.println(c1.hashCode());
        
        //第二种通过Class.forName()得到
        Class<?> c2 = Class.forName("com.chapter02_注解和反射.reflection.Student");
        System.out.println(c2.hashCode());
        
        //第三种:类名.class :
        Class<Student> c3 = Student.class;
        System.out.println(c3.hashCode());
        System.out.println("父类是:"+c3.getSuperclass());
        
        //第四种:包装类.TYPE
        Class<Integer> c5 = Integer.TYPE;
        System.out.println("--------------------------------------");
        System.out.println(c5.hashCode());
        System.out.println(c5.getName());
        System.out.println("Integer的父类为:"+c5.getSuperclass());

    }

}

class Person{

    String name;
    int age ;

    public Person(){

    }

    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }
}

class Student extends Person{

    String name ="学生";
    int age =18;

    public Student(){

    }
    public Student(String name, int age) {
        this.name = name;
        this.age = age;
    }


}

class Teacher extends Person{
    String name="老师";
    int age =35;

    public Teacher(){

    }

    public Teacher(String name, int age) {
        this.name = name;
        this.age = age;
    }
}

哪些类有class对象:

类加载器:把类装载到内存中,

系统类加载器(应用加载器)、扩展类加载器(是系统类加载器的父类)、引导类加载器(根加载器,C++编写,java获取不到。 加载rt.jar包

2.通过反射动态获得类的完整结构和信息

package com.chapter02_注解和反射.reflection;

import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;

/**
 * @author Lenovo
 * @date 2024/3/13
 * @time 9:20
 * @project Chapter01_Java_多线程
 **/
public class TestReflection02 {

    public static void main(String[] args) throws NoSuchMethodException {
        Human human = new Human();

        Class<? extends Human> c1 = human.getClass();

        /**
         *  1.通过反射获得属性;
         */
        Field[] fields = c1.getFields(); //只能拿到public的属性
        for (Field field : fields) {
            //迭代
            System.out.println(field);
        }
        /**
         * 2. getDeclaredFields:能拿到所有的属性
         */
        System.out.println("-----------------------------------");
        Field[] declaredFields = c1.getDeclaredFields();
        for (Field declaredField : declaredFields) {
            System.out.println(declaredField);
        }
        System.out.println("-----------------------------------");
        //通过反射获得方法:

        /**
         * 3. 获取具体的类:需要同时传入类名和参数类型:
         */
        Method getName = c1.getMethod("getName", null);
        System.out.println("getName方法:"+getName);

        Method setName = c1.getMethod("setName", String.class);
        System.out.println("setName方法:"+setName);
        /**
         *4. 只能拿到public类型的方法:
         */
        Method[] methods = c1.getMethods();
        for (Method method : methods) {
            System.out.println("只能拿到public的方法:"+method);
        }

        /**
         *5. 能拿到所有的方法:
         */
        System.out.println("-----------------------------------");
        Method[] declaredMethods = c1.getDeclaredMethods();
        for (Method declaredMethod : declaredMethods) {
            System.out.println(declaredMethod);
        }


        /**
         * 6. 通过反射获得构造器:
         */
        System.out.println("-----------------------------------");
        Constructor<?>[] constructors = c1.getConstructors();
        for (Constructor<?> cons : constructors) {
            System.out.println("拿到的是public类型的构造器:"+cons);
        }
        /**
         *7. 能拿到所有的构造器
         */
        System.out.println("-----------------------------------");
        Constructor<?>[] declaredConstructors = c1.getDeclaredConstructors();
        for (Constructor<?> declaredConstructor : declaredConstructors) {
            System.out.println(declaredConstructor);
        }

        /**8. 获取到父类
         *
         */
        System.out.println("-----------------------------------");
        Class<?> superclass = c1.getSuperclass();
        System.out.println("父类:"+superclass);

    }
}

class Human{
    public String name;
    public int age;
    private int id;

    public Human(){

    }

    public Human(String name, int age, int id) {
        this.name = name;
        this.age = age;
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    private void test(){

    }
}

3.通过反射动态创建对象去执行方法:

package com.chapter02_注解和反射.reflection;

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

/**
 * @author Lenovo
 * @date 2024/3/13
 * @time 9:59
 * @project Chapter01_Java_多线程
 **/
public class TestReflection03 {

    public static void main(String[] args) throws ClassNotFoundException, IllegalAccessException, InstantiationException, NoSuchMethodException, InvocationTargetException, NoSuchFieldException {
        /**
         * 通过反射去动态操作类的属性和方法;
         */
        System.out.println("--------------------------------------");
        Class<?> c1 = Class.forName("com.chapter02_注解和反射.reflection.User");
        User user1 = (User) c1.newInstance(); //实例化对象;
        System.out.println(user1);

        /**
         * 2. 通过构造器创建对象:
         */
        System.out.println("--------------------------------------");
        Constructor<?> UserCons = c1.getDeclaredConstructor(String.class, int.class, int.class);
        User user2 = (User) UserCons.newInstance("小明",18,12); //通过构造器创建对象,与之前new 出来构造器是一样的
        System.out.println(user2.getName());

        /**
         * 3. 通过反射操作方法
         */
        System.out.println("--------------------------------------");
        Method setName = c1.getMethod("setName", String.class);
        setName.invoke(user2,"小芳"); //invoke (对象,参数);
        System.out.println(user2.getName());

        /**
         * 4.通过反射操作属性:
         */
        System.out.println("--------------------------------------");
        Field name = c1.getDeclaredField("name");
        //私有的属性或者方法获取不到,可以使用 setAccessiable(true):
        name.setAccessible(true); //true:关闭安全检测开关
        name.set(user2,"狂神"); //name.set方法:
        //获取属性
        System.out.println("name:"+user2.getName());


    }
}
class User{

    private String name;
    private int age;
    private int id;

    public User() {
    }

    public User(String name, int age, int id) {
        this.name = name;
        this.age = age;
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }
}

注意:如果属性和方法都是私有的,想要去操作,可以通过setAccessiable(true)将安全检测关闭。关闭检测会提高系统的系统,比起反射调用要提高几十倍。

4.通过反射去获取泛型和注解信息:(补)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/475242.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Python爬虫基础教程:爬虫采集数据要注意什么?|电商数据商品详情页API接口

数字化时代&#xff0c;大数据信息的收集和应用逐步普及&#xff0c;离不开网络爬虫的广泛应用。由于数据和信息市场的不断扩大&#xff0c;需要大规模的网络爬虫来应对大规模的数据信息采集。在此过程中需要注意哪些问题&#xff1f; 1、先检查是否有API&#xff0c;API是网站…

Women of Polkadot:波卡生态的女性社群与创新力量

在 Web3 行业里&#xff0c;女性似乎总是被忽视的群体。线下峰会的合照一眼望去尽是西装革履的男性成员&#xff0c;项目和机构高管的名单里也似乎难以寻觅到女性领导者的身影。在这个强调技术、编程、极客精神的行业里&#xff0c;女性身份的缺席看起来如此天生自然。 根据 B…

人工智能基础部分25-一篇文章将透注意力机制(Attention)与自注意力机制(self-Attention),帮助大家加深印象

大家好&#xff0c;我是微学AI&#xff0c;今天给大介绍一下人工智能基础部分25-一篇文章将透注意力机制(Attention)与自注意力机制(self-Attention),帮助大家加深印象。注意力机制(Attention)与自注意力机制(self-Attention)都是在深度学习模型中用于提升模型性能的技术&#…

C 多维数组

C 语言支持多维数组。多维数组声明的一般形式如下&#xff1a; type name[size1][size2]...[sizeN];例如&#xff0c;下面的声明创建了一个三维 5 . 10 . 4 整型数组&#xff1a; int threedim[5][10][4];二维数组 多维数组最简单的形式是二维数组。一个二维数组&#xff0c…

测试开发面试题总结(全)

&#x1f345; 视频学习&#xff1a;文末有免费的配套视频可观看 &#x1f345; 点击文末小卡片&#xff0c;免费获取软件测试全套资料&#xff0c;资料在手&#xff0c;涨薪更快 某基金管理公司线下测试开发面试题总结。 测开题目如下 可以尝试自己先写&#xff0c;写完之后…

【Linux】实现进度条小程序

个人主页 &#xff1a; zxctscl 如有转载请先通知 文章目录 1. 前言2. 回车和换行3. 缓冲区4. 进度条4.1 倒计时设置4.2 进度条4.2.1 实现简单进度条4.2.2 进度条完善 5. 附进度条代码5.1 Processbar.h5.2 Processbar.c5.3 Main.c5.4 Makefile 1. 前言 在之前已经了解了 【Lin…

GDK-你的跳广告神器(某足兆足兆替品)

GKD&#xff08;又称搞快点&#xff09;是一款免费开源简洁多规则的自动跳过广告的软件。简而言之&#xff0c;基于预设的定时更新订阅规则快照功能&#xff0c;实现识别并自动点击跳过任何开屏广告及点击关闭应用内部任何弹窗广告&#xff0c;如关闭某些APP开屏和内含推荐广告…

数据库关系代数运算:期末+复试

文章目录 一、知识概览二、并三、差四、交五、笛卡尔积六、投影七、选择八、连接九、除实战训练 一、知识概览 二、并 三、差 四、交 五、笛卡尔积 六、投影 投影是对列 七、选择 选择是对行 八、连接 自然连接是一种特殊的等值连接&#xff0c;他要求两个关系表中进行连…

自制颜色调试网站(渐变色调试,桌面选色)

一、页面展示 二、网站 缓若江海凝清光

【Linux】进程控制 -- 详解

一、进程创建 目前学习到的进程创建的两种方式&#xff1a; 命令行启动命令&#xff08;程序、指令等&#xff09; 。通过程序自身&#xff0c;调用 fork 函数创建出子进程。 1、fork 函数初识 在 Linux 中的系统接口 fork 函数是非常重要的函数&#xff0c;它从已存在进程中…

JavaEE 初阶篇-深入了解操作系统中的进程与 PCB

&#x1f525;博客主页&#xff1a; 【小扳_-CSDN博客】 ❤感谢大家点赞&#x1f44d;收藏⭐评论✍ 文章目录 1.0 关于计算机是如何进行工作的 “常识” 1.1 关于寄存器、缓存与内存是如何配合 CPU “工作” 2.0 操作系统概述 2.1 操作系统内核 2.2 进程 2.3 PCB 2.3.1 PCB 属性…

Grok-1开源革新:探索人工智能的新境界

Grok-1开源革新&#xff1a;探索人工智能的新境界 在科技发展的马拉松中&#xff0c;Elon Musk旗下的xAI公司稳步前进&#xff0c;推出了名为Grok-1的语言模型。这个巨型模型&#xff0c;作为目前参数量最大的开源人工智能语言模型&#xff0c;赋予了机器学习领域全新的活力。 …

Swift 从获取所有 NSObject 对象聊起:ObjC、汇编语言以及底层方法调用链(二)

概览 我们在第一篇博文: 《Swift 从获取所有 NSObject 对象聊起:ObjC、汇编语言以及底层方法调用链(一)》中讨论了 Swift 语言中的钩子(Hook)机制,以及如何用它来“勾”住 NSObject 的 init 构造器方法。 不过,目前“疑云重重”的实现显然“虐”的你在一直“怀疑人生”…

信雅纳400/800G网络测试仪之 CDF/ Extended Payload 功能:完全用户自定义的协议报文支持/可编程的协议内容支持

Note# 2024-3-21 今天被一个做芯片测试的客户追着问&#xff0c;应该合作在测试仪上做完全自定义的报文&#xff0c;添加自己的私有协议进去&#xff0c;他觉得每次都导入报头太麻烦了&#xff0c;然后就看了下Application Note关于CDF功能的描述&#xff0c;照着机翻的版本来…

回归学术圈,何恺明MIT第一堂AI课

大家好&#xff0c;3月7日&#xff0c;麻省理工学院电气工程与计算机科学系副教授何恺明&#xff0c;迈上讲台&#xff0c;并成功地进行了他人生中的首堂教学课程。 第一堂课 课程官网&#xff1a;https://advances-in-vision.github.io/ 作为麻省理工学院&#xff08;MIT&am…

处理器方法的返回值--返回对象Object

处理器方法也可以返回Object对象。这个Object可以是Integer&#xff0c;String&#xff0c;自定义对象&#xff0c; Map&#xff0c;List 等。但返回的对象不是作为逻辑视图出现的&#xff0c;而是作为直接在页面显示的数据出现的。 返回对象&#xff0c;需要使用ResponseBody注…

【前端工程化】TypeScript概念及使用

前端工程化&#xff08;2&#xff09;- TS 文章目录 前端工程化&#xff08;2&#xff09;- TSTS概念TS声明变量方式TS的类访问修饰符静态属性抽象类 TS的数据类型tuple元祖enum枚举anyvoidnever enum枚举使用例子反向映射枚举和常量枚举&#xff08;const枚举&#xff09;的区…

一文读懂融资融券交易技巧!在上海开融资融券账户交易利率一般是多少?

融资融券交易技巧包括以下几点&#xff1a; 熟悉股票市场&#xff1a;了解市场走势、公司基本面等信息&#xff0c;根据趋势选择合适的股票进行交易。 做好风险管理&#xff1a;对买卖的风险进行合理评估&#xff0c;设定止损价位&#xff0c;防止损失过大。 控制杠杆比例&am…

PowerShell 一键更改远程桌面端口

前言 提高工作效率,安全性和规范化,最终实现一键更改Windows 远程桌面端口 前提条件 开启wmi,配置网卡,参考 一键更改远程桌面端口自动化脚本 默认端口3389变更后的端口3390win+r mstsc YOU_ip常规更改的连接方式win+r mstsc YOU_ip:3390需要恢复到原来的端口3390更改成3…

【Linux笔记】汇编

汇编笔记 启动方式