百度360必应搜狗淘宝本站头条
当前位置:网站首页 > IT技术 > 正文

Java进阶反射?这其实是黑客的人肉手段啊

wptr33 2025-02-21 15:39 32 浏览

文章目录

  • 前言(先扯几句家常)
  • 反射
    • 用处
    • 优缺点
    • 用法
      • 简单使用
      • 使用对象获取类的构造方法
      • 获取成员变量
      • 获取成员方法
    • 总结
  • 结语

前言(先扯几句家常)

个人主张自学,但是也不能忘记了讨论的重要性,但是由于平时不z怎么看CSDN,所以呢我这边搞了一个小圈子,欢迎大家来哦~可以畅所欲言呀——java小圈子

不过CSDN评论区我也会不定时观看的,所以非强制性要求哦


反射

什么是反射?就是Java中可以通过反射,将类的各个组成成分映射成一个个的对象。

好,这是我查看别人的解释。

那么现在就来说说我对反射的理解。

反射:

就是在你只知道一个类名,而且无法查看类的源码(也就是说你对这个类的理解只局限于你知道类名)的时候,可以通过反射来将类中的各个成分调出来,成为一个个对象,可以通过反射了解这个类的成分。如果你不知道类里面都有哪些成分的话,那说明你的基础还不够扎实,推荐你去看看我的类三部曲。

那么这么说还是有点不太容易理解吧。

那就举个例子:

我是一个黑客,有个人叫张三(类),他惹了我,我知道了他的名字(类名),我通过技术手段(反射)人肉到了他的个人消息(各个组成成分)

这就是反射!

用处

反射可以将加载到JVM中的类的信息加载出来,供我们使用。

反射在框架架构中经常使用,而在日常开发中,并不经常使用。

那么为什么我们还需要学习反射呢?因为我们需要去看别人的框架源码来深入学习,而如果我们对反射不理解的话,就不能理解别人的源码。

优缺点

优点

  • 增加程序的灵活性,避免将固有的逻辑程序写死到代码里
  • 代码简洁,可读性强,可提高代码的复用率

缺点

  • 相较直接调用在量大的情景下反射性能下降
  • 存在一些内部暴露和安全隐患

用法

使用反射技术,就不得不提一下Class类,下面我们先看看别人对Class类的说法:

Class 类的实例表示正在运行的 Java 应用程序中的类和接口。也就是Java虚拟机中有N多的实例每个类都有该Class对象。(包括基本数据类型)
Class 没有公共构造方法。Class 对象是在加载类时由 Java 虚拟机以及通过调用类加载器中的defineClass 方法自动构造的。也就是这不需要我们自己去处理创建,JVM已经帮我们创建好了。

——摘自Java基础之—反射(非常重要)

换句话说,我们所用到的所有类,都是Class类的一个实例化对象。是不是感觉有点难,没事,其实之前我听过一个底层大佬的一句话,感觉受益很多:

每个类都是更抽象的类的对象罢了

而我们现阶段不需要了解那么多,只需要使用Class类中的方法就可以了

简单使用

好了,巴拉巴拉地说了这么多,也该上代码了

  1. 首先呢,我们先定义一个类class Girl_5_5{ String name; Integer age; Integer ID; public void describe(String name, Integer age, Integer id){ this.ID = id; this.name = name; this.age = age; System.out.printf("我是%s,我的证明是%d,我今年%d岁了", name, id, age); } }
  2. 我们需要获取Class对象获取Class对象的三种方式Object类(自定义类的默认父类)的getClass();方法类自带的class属性 类名.classs;通过Class类的静态方法:forName(String className)(常用)public class Fanshe { public static void main(String[] args) { Girl_5_5 girl = new Girl_5_5(); //实例化一个对象 //第一种方法,使用所自定义类中的默认父类Object的class方法 Class extends Girl_5_5> girlClass = girl.getClass(); //第二种方法 访问静态属性class获取 Class<Girl_5_5> girlClass1 = Girl_5_5.class; //第三种方法 try { Class girlClass2 = Class.forName("com.util.text.基础语法.反射.Girl_5_5"); System.out.println(girlClass+"\n"+girlClass1+"\n"+girlClass2); } catch (ClassNotFoundException e) { e.printStackTrace(); } } } class Girl_5_5{ String name; Integer age; long ID; public void describe(String name, Integer age, long id){ this.ID = id; this.name = name; this.age = age; System.out.printf("我是%s,我的证明是%d,我今年%d岁了", name, id, age); } }

运行结果:

这都是我们的Girl_5_5类对象,我们将这个类,通过反射实例化成了一个Class类的对象,可以通过这个对象调用Class的方法,通过Class的方法可以获得Girl_5_5的构造方法,成员变量等,并将其化为一个一个的对象。

使用对象获取类的构造方法

所有构造方法:
girlClass2.getDeclaredConstructors();

所有公有构造方法:
girlClass2.getConstructors();

所有公有无参构造方法:girlClass2.getConstructor(null); 这个参数也可以不放

import java.lang.reflect.Constructor;
import java.util.Arrays;

public class Fanshe {
    public static void main(String[] args) throws Exception {
        Girl_5_5 girl = new Girl_5_5();  //实例化一个对象
        //第一种方法,使用所自定义类中的默认父类Object的class方法
        Class girlClass = girl.getClass();
        //第二种方法 访问静态属性class获取
        Class girlClass1 = Girl_5_5.class;
        //第三种方法 通过forName方法获取
        try {
            Class girlClass2 = Class.forName("com.util.text.基础语法.反射.Girl_5_5");
            //输出三种方法
            System.out.println(girlClass+"\n"+girlClass1+"\n"+girlClass2);
            //所有构造方法
            String allConstructors = Arrays.toString(girlClass2.getDeclaredConstructors());
            //所有共有构造方法
            String publicConstructors = Arrays.toString(girlClass2.getConstructors());
            //共有无参构造方法
            String nullConstructors = Arrays.toString(new Constructor[]{girlClass2.getConstructor(null)});
            //输出看看
            System.out.println(allConstructors+"\n"+publicConstructors+"\n"+nullConstructors);
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }


    }
}
class Girl_5_5{
    String name;
    Integer age;
    long ID;
    public void describe(String name, Integer age, long id){
        this.ID = id;
        this.name = name;
        this.age = age;
        System.out.printf("我是%s,我的证明是%d,我今年%d岁了", name, id, age);
    }

    /**
     * 共有有参构造方法
     * @param name:提供一个形参
     */

    public Girl_5_5(String name){
        System.out.println(name+"hello");
    }

    /**
     * 共有无参构造方法
     */
    public Girl_5_5(){

    }

    /**
     * 私有有参构造方法
     * @param age:提供形参
     */
    private Girl_5_5(Integer age){

    }
}

运行结果:

获取成员变量

获取所有:
girlClass.getDeclaredFields();

获取所有公有:girlClass.getFields();

具体我就不一一举例子了

获取成员方法

获取所有:
girlClass.getDeclaredMethods();

获取所有公有:girlClass.getMethods();

总结

反射就是能在你只知道类名的时候,获取调用类的各种组成成分。

相关推荐

MySQL进阶五之自动读写分离mysql-proxy

自动读写分离目前,大量现网用户的业务场景中存在读多写少、业务负载无法预测等情况,在有大量读请求的应用场景下,单个实例可能无法承受读取压力,甚至会对业务产生影响。为了实现读取能力的弹性扩展,分担数据库压...

Postgres vs MySQL_vs2022连接mysql数据库

...

3分钟短文 | Laravel SQL筛选两个日期之间的记录,怎么写?

引言今天说一个细分的需求,在模型中,或者使用laravel提供的EloquentORM功能,构造查询语句时,返回位于两个指定的日期之间的条目。应该怎么写?本文通过几个例子,为大家梳理一下。学习时...

一文由浅入深带你完全掌握MySQL的锁机制原理与应用

本文将跟大家聊聊InnoDB的锁。本文比较长,包括一条SQL是如何加锁的,一些加锁规则、如何分析和解决死锁问题等内容,建议耐心读完,肯定对大家有帮助的。为什么需要加锁呢?...

验证Mysql中联合索引的最左匹配原则

后端面试中一定是必问mysql的,在以往的面试中好几个面试官都反馈我Mysql基础不行,今天来着重复习一下自己的弱点知识。在Mysql调优中索引优化又是非常重要的方法,不管公司的大小只要后端项目中用到...

MySQL索引解析(联合索引/最左前缀/覆盖索引/索引下推)

目录1.索引基础...

你会看 MySQL 的执行计划(EXPLAIN)吗?

SQL执行太慢怎么办?我们通常会使用EXPLAIN命令来查看SQL的执行计划,然后根据执行计划找出问题所在并进行优化。用法简介...

MySQL 从入门到精通(四)之索引结构

索引概述索引(index),是帮助MySQL高效获取数据的数据结构(有序),在数据之外,数据库系统还维护者满足特定查询算法的数据结构,这些数据结构以某种方式引用(指向)数据,这样就可以在这些数据结构...

mysql总结——面试中最常问到的知识点

mysql作为开源数据库中的榜一大哥,一直是面试官们考察的重中之重。今天,我们来总结一下mysql的知识点,供大家复习参照,看完这些知识点,再加上一些边角细节,基本上能够应付大多mysql相关面试了(...

mysql总结——面试中最常问到的知识点(2)

首先我们回顾一下上篇内容,主要复习了索引,事务,锁,以及SQL优化的工具。本篇文章接着写后面的内容。性能优化索引优化,SQL中索引的相关优化主要有以下几个方面:最好是全匹配。如果是联合索引的话,遵循最...

MySQL基础全知全解!超详细无废话!轻松上手~

本期内容提醒:全篇2300+字,篇幅较长,可搭配饭菜一同“食”用,全篇无废话(除了这句),干货满满,可收藏供后期反复观看。注:MySQL中语法不区分大小写,本篇中...

深入剖析 MySQL 中的锁机制原理_mysql 锁详解

在互联网软件开发领域,MySQL作为一款广泛应用的关系型数据库管理系统,其锁机制在保障数据一致性和实现并发控制方面扮演着举足轻重的角色。对于互联网软件开发人员而言,深入理解MySQL的锁机制原理...

Java 与 MySQL 性能优化:MySQL分区表设计与性能优化全解析

引言在数据库管理领域,随着数据量的不断增长,如何高效地管理和操作数据成为了一个关键问题。MySQL分区表作为一种有效的数据管理技术,能够将大型表划分为多个更小、更易管理的分区,从而提升数据库的性能和可...

MySQL基础篇:DQL数据查询操作_mysql 查

一、基础查询DQL基础查询语法SELECT字段列表FROM表名列表WHERE条件列表GROUPBY分组字段列表HAVING分组后条件列表ORDERBY排序字段列表LIMIT...

MySql:索引的基本使用_mysql索引的使用和原理

一、索引基础概念1.什么是索引?索引是数据库表的特殊数据结构(通常是B+树),用于...