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. I类HDACs是乳酸化修饰“eraser”

    赖氨酸酰化修饰 (lysine acylation) 是一种广泛存在的.进化上高度保守的蛋白质翻译后修饰 (post-translational modifications, PTMs) 类型,通过表 ...

  2. 两年Android开发三面上岸腾讯,这些核心知识点建议收藏

    概述 感觉毕业后时间过得真快啊,从 19 年 7 月本科毕业入职后,到现在快两年了,前段时间金三银四期间想着找一个新的工作,前前后后花了一个多月的时间复习以及面试,面试好几家大厂,最后选择了腾讯.也祝 ...

  3. 关于java新特性lambda表达式的理解即使用

    Lambda 表达式的使用 1.举例: (o1,o2) -> Integer.compare(o1,o2); 2.格式: -> : lambda操作符 或 箭头操作符 ->左边 : ...

  4. 一文让你彻底掌握ArcGisJS地图管理的秘密

    使用ArcGis开发地图 引用ArcGisJS 使用ArcGisJS开发地图,首先需要引入ArcGis的Js文件和CSS文件,引入方式有两种,一种是官网JS引用,一种是本地JS引用.如下: 官网JS引 ...

  5. Git的使用以及整理

    Usage of Git 1 Git区域划分 1)工作区(working directory):默认为项目根目录root 2)缓存区(stage):在版本库中设立一个缓存/暂存区,直接和工作区的文件进 ...

  6. Run Clojure Script with External Dependencies without leiningen

    The normal way of deploy clojure files is using leiningen. But if we have no leiningen, or the scrip ...

  7. 用kivy学习制作简易调色画板app

    制作一款简易的调色画板,要用到的知识:页面布局.ToggleButton.ToggleButtonBehavior.get_color_from_hex(兼容十六进制编码颜色):功能上要可以选择颜色, ...

  8. mysql 优化面试题

    第一方面:30种mysql优化sql语句查询的方法 1.对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by涉及的列上建立索引. 2.应尽量避免在 where 子句中使用 ...

  9. C#基础知识---装箱与拆箱

    一.定义 装箱:将值类型转化为引用类型,装箱一般会在堆上分配一块内存,用于存储要转换的值. 拆箱:将引用类型转化为值类型 注:.NET 2.0 引入的泛型其实在很大的程度上解决了装拆箱产生的类型转换问 ...

  10. HttpURLconnection的介绍

    一,HttpURLconnection的介绍 在Android开发中网络请求是最常用的操作之一, Android SDK中对HTTP(超文本传输协议)也提供了很好的支持,这里包括两种接口: 1.标准J ...