Java对类私有变量的暴力反射技术讲解

Java对类私有变量的暴力反射

假设有一个类,他有一个私有变量:

package com.howlaa.day04;
public class ReflectPoint {
 private int priVar;
 public ReflectPoint(int priVar){
 this.priVar =priVar;
}
}

如果我们直接采用.get的方式,是不可能看到私有变量的。

我们可以这样:

package com.howlaa.day04;
import java.lang.reflect.Field;
public class ReflectTest {
 public static void main(String[] args) throws Exception {
 ReflectPoint pt1 = new ReflectPoint(3);
 Field fieldx = pt1.getClass().getDeclaredField("priVar");
 fieldx.setAccessible(true);
 fieldx.set(pt1, 100);
 System.out.println(fieldx.get(pt1));
 }
}

输出:100;

那么这个Filed是什么呢?他 是一个类,表示属性的类。通过pt1得出ReflectPoint的字节码。然后再调用getDeclaredField方法,可以获取x属性。再通过setAccessible使得可以访问这个属性。然后可以通过set方法赋值。注意:getClass获得是ReflectPoint的字节码,与具体实例无关,因此,Field也与具体实例无关。在设置和访问的时候,均需要指定具体哪个实例。

Java对于私有变量的“暴力反射”技术

(1)两个类:(在同一包下即可)

(2)ReflectPoint

(3)ReflectTest(下边代码写在类里即可)

实现了暴力反射!!

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对我们的支持。如果你想了解更多相关内容请查看下面相关链接

(0)

相关推荐

  • Java动态代理和反射机制详解

    反射机制 Java语言提供的一种基础功能,通过反射,我们可以操作这个类或对象,比如获取这个类中的方法.属性和构造方法等. 动态代理:分为JDK动态代理.cglib动态代理(spring中的动态代理). 静态代理 预先(编译期间)确定了代理者与被代理者之间的关系,也就是说,若代理类在程序运行前就已经存在了,这种情况就叫静态代理 动态代理 代理类在程序运行时创建的代理方式.也就是说,代理类并不是在Java代码中定义的,而是在运行期间根据我们在Java代码中的"指示"动态生成的. 动态代理比

  • Java反射机制的讲解

    Java中的反射提供了一种运行期获取对象元信息的手段.即正常方法是通过一个类创建对象,反射方法就是通过一个对象找到一个类的信息. Java的反射机制的实现要借助于4个类:class,Constructor,Field,Method; 其中class代表的时类对 象,Constructor-类的构造器对象,Field-类的属性对象,Method-类的方法对象.通过这四个对象我们可以粗略的看到一个类的各个组成部分. Java反射的作用: 在Java运行时环境中,对于任意一个类,可以知道这个类有哪些属

  • 实例讲解Java基础之反射

    前期准备 编写一个真实类phone,实现list接口 public class Phone implements List { public double price; public String name; public Phone() { } public Phone(double price, String name) { this.price = price; this.name = name; } public double getPrice() { return price; } p

  • Java在利用反射条件下替换英文字母中的值

    Java在利用反射条件下替换英文字母中的值 (1)创建两个Class: ReflectTest类如下: package cn.itcast.day01; import java.lang.reflect.Constructor; import java.lang.reflect.Field; public class ReflectTest { public static void main(String[] args) throws Exception { changeStringValue(

  • 详解提高使用Java反射的效率方法

    在我们平时的工作或者面试中,都会经常遇到"反射"这个知识点,通过"反射"我们可以动态的获取到对象的信息以及灵活的调用对象方法等,但是在使用的同时又伴随着另一种声音的出现,那就是"反射"很慢,要少用.难道反射真的很慢?那跟我们平时正常创建对象调用方法比慢多少? 估计很多人都没去测试过,只是"道听途说".下面我们就直接通过一些测试用例来直观的感受一下"反射". 正文 准备测试对象 下面先定义一个测试的类Test

  • java反射机制Reflection详解

    Java语言有好些个名词,让人望而生畏. 上智不教即知,下愚虽教无益,中庸之人,不教不知. 人的天性中就有一点对未知的恐惧. 刚开始不了解,也没认真看,发现好难呀:等,静下心来自己研究,再看其实不难,发现都是纸老虎,不堪一击. 今天就来分析一下反射:Reflection 看一下维基百科的解释: 在诸如Java之类的面向对象的程序设计语言中,反射允许在程序运行期间访问 类.接口.字段和方法,而不必在编译期间知道接口.字段或者方法的名称. 反射也允许实例化对象和调用方法. 总结三点: 第一:反射可以

  • Java注解与反射原理说明

    一 点睛 注解若想发挥更大作用,还需借助反射机制之力.通过反射,可以取得一个方法上声明的注解的全部内容. 一般有两种需求: 1 取得方法中全部的注解,通过调用getAnnotations来实现. 2 判断操作是否是指定注解,通过调用getAnnotation来实现. 下面从源码角度来说明怎样获取这些注解信息. 二 源码导读--取得方法中全部的注解 public class AccessibleObject implements AnnotatedElement { ... //取得全部Annot

  • Java对类私有变量的暴力反射技术讲解

    Java对类私有变量的暴力反射 假设有一个类,他有一个私有变量: package com.howlaa.day04; public class ReflectPoint { private int priVar; public ReflectPoint(int priVar){ this.priVar =priVar; } } 如果我们直接采用.get的方式,是不可能看到私有变量的. 我们可以这样: package com.howlaa.day04; import java.lang.refle

  • Python学习之私有函数,私有变量及封装详解

    目录 什么是私有函数和私有变量 私有函数与私有变量的定义方法 Python中的封装 面向对象编程小练习 通过学习私有函数与私有变量,可以更好的完善 类的开发 ,从而丰满我们的场景与实现方案. 什么是私有函数和私有变量 私有函数与私有变量中的私有是什么意思? —> 简单理解就是独自拥有.不公开.不分享的意思.放到函数与变量中就是独自拥有的函数与独自拥有的变量,并且不公开.这样我们就理解了什么是私有函数与私有变量. 无法被实例化后的对象调用的类中的函数与变量 虽然无法被实例化后的对象调用,但是在 类

  • java 嵌套类的详解及实例代码

    java 嵌套类 到现在为止,我们都是在Java文件中直接定义类.这样的类出现在包(package)的级别上.Java允许类的嵌套定义. 这里将讲解如何在一个类中嵌套定义另一个类. 内部类 Java允许我们在类的内部定义一个类.如果这个类是没有static修饰符,那么这样一个嵌套在内部的类称为内部类(inner class). 内部类被认为是外部对象的一个成员.在定义内部类时,我们同样有访问权限控制(public, private, protected). 在使用内部类时,我们要先创建外部对象.

  • Python类如何定义私有变量

    这篇文章主要介绍了Python类如何定义私有变量,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 前言 在java 的类中,如果你要定义一个私有变量,可以用修饰词 private,那么在Python 的类中呢,Python中没public private之类的修饰词,那Python 是如何定义私有变量的呢? 私有变量 在Python 类中定义私有变量,只要在变量前加 __ (两个下划线) ,那么该类的实例就不能引用了,看下面实例 >>>

  • Java面向对象基础,类,变量,方法

    一.面向对象的4个基本特征 抽象性.封装性.继承性和多态性. 抽象性分为过程抽象和数据抽象. 封装性 封装将数据以及加在这些数据上的操作组织在一起,成为有独立意义的构件.外部无法直接访问封装的数据,从而保证了这些数据的正确性. 如果外部需要访问类里面的数据,就必须通过接口.接口规定了可对一个特定的对象发出哪些请求. 继承性 继承是一种联结的层次模型,并允许和鼓励类的重用,它提供给了一种明确表述共性的方法.对象的一个新类可以从现有的类中派生,这个过程称为类继承.新类继承了原始类的特性,新类称为原始

  • Java Scala数据类型与变量常量及类和对象超详细讲解

    目录 一.数据类型 二.变量和常量 三.类和对象 3.1 类 3.2 对象 3.3 伴生类和伴生对象 3.4 Scala的main函数只能写在object里 总结 一.数据类型 简记: 所有基础类型基本与Java的包装类等同,唯一有不同的Int(Scala),Integer(Java),注意这个就好 Unit, Null, Nothing, Any, AnyRef, AnyVal,这几个除了Null乍一眼会有些陌生,不要怕,上总结: 首先是层级图: 然后是表格: 补丁: 记住Any是所有类型的超

  • JavaScript 模拟类机制及私有变量的方法及思路

    在使用一些 Javascript 框架时,或许会看到类似的代码 复制代码 代码如下: var MyClass = new Class({ initialize: function(param, ...) { this.param = param; ... }, func1: function(...) { ... } }); var myObj = new MyClass(param); myObj.func1(...); 这是一种典型的面向对象的类机制应用,与原生的 Javascript 类机

  • 详解ES6实现类的私有变量的几种写法

    闭包实现类的私有变量方式 私有变量不共享 通过 new 关键字 person 的构造函数内部的 this 将会指向 Tom,开辟新空间,再次全部执行一遍, class Person{ constructor(name){ let _num = 100; this.name = name; this.getNum = function(){ return _num; } this.addNum = function(){ return ++_num } } } const tom = new Pe

  • js类中的公有变量和私有变量

    在cnblogs上看了关于js的一些文章 ,做下笔记: 先看代码1: function car(){     var wheel = 3;//私有变量     this.wheel = 4;//公有变量     alert(wheel);     alert(this.wheel); } var car1 = new car();结果是:3 4 代码2: function car(){     var wheel = 3;//私有变量     this.wheel = 4;//公有变量 } va

  • Java反射技术原理与用法实例分析

    本文实例讲述了Java反射技术原理与用法.分享给大家供大家参考,具体如下: 本文内容: 产生反射技术的需求 反射技术的使用 一个小示例 首发日期:2018-05-10 产生反射技术的需求: 项目完成以后,发现需要增加功能,并且希望增加功能并不需要停止项目运行. 在希望不关停项目运行的情况下,于是考虑到将功能都放到一个单独的项目之外的模块中,每一个功能实现都从这个模块中获取[实际上这个考虑应该是项目开始前就考虑,这个例子可能不是很好].于是就有了反射的产生.(这种思想有点类似工厂模式,如果学过设计

随机推荐