JAVA安全基础之反射

在JAVA安全中,反射是一个经常使用的技术,所以熟悉使用反射是非常必要的。下面就简单的讲下JAVA的反射的用法

什么是反射

每个类都有对应的Class类对象,该Class类对象包含该类的属性、方法等信息,这个Class类对象就是这个类的反射。

就像镜子一样,一个类照镜子后,镜子里的类对象就是一个Class对象。它描述了这个类的所有属性、方法等。

作用

可以在程序运行过程中,操作这些对象的属性、方法等。

使用

说着其实是挺抽象的,那我们直接通过例子来了解反射

当一个类从JAVA代码到被new出来后,这中间是经历了三个阶段。

Source源代码阶段:Person.java文件通过JAVAC编译后,成为了Person.class字节码文件,此时两个文件还存在硬盘上,并没有进内存。

Class类对象阶段:把class字节码文件通过类加载器ClassLoader加载进了内存,生成了一个Class类对象,Class类对象把Person.class中的所有属性、方法等都进行了一次封装。

Runtime运行时阶段:也就是new出了一个对象的阶段,此对象参与了程序的运行。

获取Class对象的三种方式

  1. Class.forName("全类名"):将字节码文件加载进内存,返回Class对象

  2. 类名.class:通过类名的属性class获取

  3. 对象.getClass():getClass()方法在Object类中定义着。

注意:

1)同一个字节码文件(*.class)在一次程序运行过程中,只会被加载一次,不论通过哪一种方式获取的Class对象都是同一个。

2)因为静态代码块是在类加载的时候执行,所以如果类中包含静态代码块,那么除了Person.class这种方法外的另外两种方法,都会造成静态代码块的执行,且只执行一次。

获取成员变量

1.获取public 修饰的成员变量

Field[] getFields() :获取所有 public 修饰的成员变量

Field getField(String name) 获取指定名称的 public 修饰的成员变量

2.获取任意的成员变量

Field[] getDeclaredFields() 获取所有的成员变量,不考虑修饰符

Field getDeclaredField(String name) 获取指定名称的的成员变量

获取不是public权限的成员变量需要是要暴力反射

获取构造方法

1.获取public 修饰的构造方法

Constructor<?>[] getConstructors() 获取 public 修饰的空参构造方法

Constructor getConstructor(类<?>... parameterTypes) 获取 public 修饰的有参构造方法

2.获取任意的构造方法

Constructor<?>[] getDeclaredConstructors() 无视修饰符获取空参构造方法

Constructor getDeclaredConstructor(类<?>... parameterTypes) 无视修饰符获取有参构造方法

同样要使用暴力反射

获取成员方法

1.获取public 修饰的构造方法method

Method[] getMethods() 获取 public 修饰的空参方法method

Method getMethod(String name, 类<?>... parameterTypes) 获取 public 修饰的有参方法method

2.获取任意的method方法

Method[] getDeclaredMethods() 无视修饰符获取空参方法

Method getDeclaredMethod(String name, 类<?>... parameterTypes) 无视修饰符获取有参方法

同样要使用暴力反射

获取全类名

String getName()

反射创建对象的两种方式

一、直接用Class类对象获取对应实例

// 调用无参构造器 ,若是没有,或者类构造函数是私有的,则会报异常
Class clazz = Class.forName("com.yyhuni.Person");
Object o = clazz.newInstance();

二、有带参数的构造函数的类,先获取到其构造对象,再通过该构造方法类获取实例:

Class clazz =  Class.forName("com.yyhuni.Person");
//获取构造函数类的对象
Constroctor constroctor = clazz.getConstructor(String.class,Integer.class); // 使用构造器对象的newInstance方法初始化对象
Object obj = constroctor.newInstance("yy", 18);

欢迎关注我的公众号,同步更新喔

JAVA安全基础之反射的更多相关文章

  1. 【读书笔记】Java核心技术-基础知识-反射

    在网页中运行Java程序称为applet. 反射 这项功能被大量地应用于JavaBeans中,它是Java组件的体系结构. 能够分析类能力的程序称为反射(reflective).反射机制的功能及其强大 ...

  2. 黑马程序员:Java基础总结----反射

    黑马程序员:Java基础总结 反射   ASP.Net+Android+IO开发 . .Net培训 .期待与您交流! 反射 反射的基石:Class类 Class类代表Java类,它的各个实例对象又分别 ...

  3. Java基础之一反射

    反射是框架设计的灵魂 (使用的前提条件:必须先得到代表的字节码的Class,Class类用于表示.class文件(字节码))   一.反射的概述 JAVA反射机制是在运行状态中,对于任意一个类,都能够 ...

  4. JAVA常用基础知识点[继承,抽象,接口,静态,枚举,反射,泛型,多线程...]

    类的继承 Java只支持单继承,不允许多重继承- 一个子类只能有一个父类- 一个父类可以派生出多个子类这里写图片描述子类继承了父类,就继承了父类的方法和属性.在子类中,可以使用父类中定义的方法和属性, ...

  5. Java基础之—反射

    反射是框架设计的灵魂 (使用的前提条件:必须先得到代表的字节码的Class,Class类用于表示.class文件(字节码))   一.反射的概述 JAVA反射机制是在运行状态中,对于任意一个类,都能够 ...

  6. Java 高级基础——反射

    Java 高级基础--反射 反射的意义:Java 强类型语言,但是我们在运行时有了解.修改信息的需求,包括类信息.成员信息以及数组信息. 基本类型与引用类型 基本类型,(固定的 8 种) 整数:byt ...

  7. JAVA基础知识|反射

    一.理解反射 1.1.基础概念 反射:在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意方法和属性:这种动态获取信息以及动态调用对象方法的功能称为ja ...

  8. Java基础学习笔记二十三 Java核心语法之反射

    类加载器 类的加载 当程序要使用某个类时,如果该类还未被加载到内存中,则系统会通过加载,链接,初始化三步来实现对这个类进行初始化. 加载就是指将class文件读入内存,并为之创建一个Class对象.任 ...

  9. java基础之反射---重要

    java反射: 反射是框架设计的灵魂 (使用的前提条件:必须先得到代表的字节码的Class,Class类用于表示.class文件(字节码)):   1:获取Class字节码文件对象的三种方式: /** ...

随机推荐

  1. OpenFaaS实战之九:终篇,自制模板(springboot+maven+jdk8)

    欢迎访问我的GitHub https://github.com/zq2599/blog_demos 内容:所有原创文章分类汇总及配套源码,涉及Java.Docker.Kubernetes.DevOPS ...

  2. rsa加密初探

    RSA加密算法初探 RSA加密算法是早期的非对称加密,公钥和私钥分离,公开公钥,通过确保私钥的安全来保证加密内容的安全.由麻省理工学院的罗纳德·李维斯特(Ron Rivest).阿迪·萨莫尔(Adi ...

  3. Hello World!!

    已经工作了一年多,现在才开始写博客.话说,种一棵树最好的时机是十年前,其次是现在,我觉得不迟.俗话说滴水穿石,我想把一些东西,都慢慢积累起来,看见自己的成长.既方便查看,更不容易忘记.可能在网上已经有 ...

  4. Linux 鸟叔的私房菜--完全结束

    2018年10月22日 我不想再拖下去了,一本书看不完就无法进行下一本书的阅读,可能算是我的一个强迫症(借口吧) 之前看05年第一版<鸟叔的Linux私房菜>停在脚本语言那里,迟迟没有前进 ...

  5. SWAP的罪与罚&&NUMA的取舍

    说个案例:一台Apache服务器,由于其MaxClients参数设置过大,并且恰好又碰到访问量激增,结果内存被耗光,从而引发SWAP,进而负载攀升,最终导致宕机. 正所谓:SWAP,性能之大事,死生之 ...

  6. Golang语言系列-09-接口

    接口 接口的定义和实现 package main import "fmt" /* [接口] 接口(interface)定义了一个对象的行为规范,只定义规范不实现,由具体的对象来实现 ...

  7. The requested PHP extension ext-http * is missing from your system. Install or enable PHP's http ex

    composer.json 包含 "require": { "ext-http": "*" } 删掉  "ext-http&quo ...

  8. 自定义Vue&Element组件,实现用户选择和显示

    在我们很多前端业务开发中,往往为了方便,都需要自定义一些用户组件,一个是减少单一页面的代码,提高维护效率:二个也是方便重用.本篇随笔介绍在任务管理操作中,使用自定义Vue&Element组件, ...

  9. 什么是挂载,Linux挂载详解

    前面讲过,Linux 系统中"一切皆文件",所有文件都放置在以根目录为树根的树形目录结构中.在 Linux 看来,任何硬件设备也都是文件,它们各有自己的一套文件系统(文件目录结构) ...

  10. spring学习日志二

    一.spring依赖注入的方式 1.通过set方法来完成注入 <bean id="student" class="com.zhiyou100.xz.spring.S ...