保证你一天不困的25个小方法

1.起床后操练5分钟

如此这般做不仅为人身充电,而且能加倍燃烧卡路里。很四人误认为晨练必须5点钟爬起来跑上几公里,其实是不必要,也不太现实的。你只消花5分钟,
做做俯卧撑和踊跃运动,使心率加快,就能达成理想的意义;要么对着镜子冲拳100下,感受这种能量积蓄的进程。

  前言:在上一篇博文《小白也能看懂的插件化DroidPlugin原理(一)–
动态代理》
中详细介绍了
DroidPlugin
原理中关系到的动态代理情势,看完上篇博文后你就会发现原本动态代理真的非凡简单,只可是就是促成一个
InvocationHandler 接口重写一下 invoke 方法而已。不错,其实过多像样 high
level
的技能都并不曾想像中的那么晦涩难懂,只要你肯下定狠心去掌握它,去认识它,去学习它你就会发现,原来都是足以学得懂的。本篇博文将介绍
DroidPlugin 框架中常用到的此外多个知识点–反射机制和Hook技术。

2.养成喝水习惯

处于缺水状况的你,会通常觉得衰惫。清早起来先喝一杯水,做一下内卫生,也为五脏六腑加些“润滑剂”;每日至少喝进去一升水,可是也不是累累。

  本类别著作的代码已经上传至github,下载地址:https://github.com/lgliuwei/DroidPluginStudy 本篇著作对应的代码在
com.liuwei.proxy_hook.reflect
和 com.liuwei.proxy_hook.hook.simplehook 包内。

3.敬服吃早餐

米国有探究发现,不吃早餐的肢体高体重比(BMI)偏高,也就是体重超标,还爱犯困,做事无精打采;讲究吃早餐的人则精力旺盛得多,身形也相对均衡。最营养
健康的西式早餐是:两片全麦面包.一块熏三文鱼和一个番茄。全麦面包含有抬高的木质素和纤维;西红柿的西红柿红素有利于骨骼的生长和调理,并且对前列
腺疾病的警备很有便宜;三文鱼中增长的omega-3脂肪酸和矿物质对人体进一步便于。

一、反射机制

4.十点加餐

固然早餐吃得没错,到中午十点半,前一天囤积的糖原也大抵用没了。你要想在一天剩下的岁月仍像刚充完电,那时就非得加加餐。一块巧克力,或者一根能量棒.几块饼干,补充能量以外,还是能使得避免午餐暴饮暴食。

  1、反射是怎么?

5.午后喝咖啡

午餐后,身体的上床因子(一种能抓住睡眠的分子)成分扩展,是最容易犯困的时候,此时喝一小杯咖啡效果最好。当然喝茶也行,随你喜欢!别忘了睡前4钟头内毫不喝咖啡,免得过于兴奋睡不着。

  JAVA反射机制是在运转状况中,对于自由一个类,都可以精通这多少个类的有所属性和章程;对于自由一个目的,都可以调用它的随机方法和性质;这种动态获取音信以及动态调用对象方法的功用称为java语言的反光机制。

6.多倾诉多纾解

性格也能调节疲惫。荷兰王国的一项探究声明,在工作中内向.害羞的人更易于觉得累,而活泼的人生气更足,这是因为爱跟人交谈的人擅长发现乐趣,把自己的烦恼.压力及不好事一股脑说出去,就不会觉得累和无聊,相反地,喜欢安静.独处.不爱社交的人紧缺这种纾解压力的渠道,时间长了,必然感觉不堪重负。

  2、反射机制的效能:

7.坐有坐相

坐姿不良,走路踢里踏拉,耸肩腆肚,这一个普普通通是你能量已耗干的呈现。在办公室一坐就是七三个刻钟,如若不可以维持正确的姿势,反而会以为更疲劳。不管是站依然坐着,应当收腹立腰,放松双肩,脖子有稍稍伸展的感觉到。

  (1)反射可以在运作时判断任意一个目的所属的类;

8.张驰结合

作中遇见难题,一时半会儿又无奈解决,不如稍事休息,如去倒杯茶,换换脑筋,然后随即干。累得快透可是气来时,深吸一口气(数3下),然后呼出来(数6下);或者翻翻体育杂志,上网浏览娱乐八卦,找什么人聊几句,说不定灵感在不在意间就来了。

  (2)反射能够在运行时社团任意一个类的靶子;

9.站起来接电话

站着打电话借机舒展舒展筋骨,一边深呼吸,使富含氧气的血液流进大脑。这么些大概的浮动能让你多少个刻钟都精两倍旺。

  (3)反射可以在运作时判断任意一个类具有的妄动成员变量和办法;

10.边沉浸边唱歌

淋浴时大声唱歌促进肢体自由内啡呔,从而发生一种快乐与甜美的感到,减轻压力。你越来越心理不佳的时候,越要唱出来,至于好不令人知足,跑没跑调,你管它吗!

  (4)反射可以在运作时调用任意一个类的即兴方法;

11.交无忧无虑的心上人

乐观.精力旺的对象或同事人见人爱,他们再接再厉的情怀总能感染周围的人。不仅要和灵性有才气的人来往,更要和这几个充满热情,积极向上的人交朋友;跟一个悲观.喜欢抱怨的人联袂呆上30分钟,你的能量就会被直接耗尽

  (5)可以经过反射机制转变动态代理。

12.大事化小

一举吃不成胖子!不要总想着把某项大工程一气做完,结果自己累得趴下了。不妨把大工程拆成几何个小工程,一样同样地做,时不时休息一下,这样,既保障体力,又能增高工作功能,最终仍能加快工作进度。

  3、Talk is cheap,show me the code. 来一组反射机制小示例

13.磨砺背部

您有没发现“背多分”型的丈夫往往受到殊遇,不仅如此,强壮的后背能让您办事起来比旁人更轻松,不觉得太累。操练背部最实惠的方法是用划桨器,注意姿势要正确;脚放平,膝盖微曲,双桨恰到好处地停在胸部。

  首先创建一个类供反射调用测试使用,暂且将类名
BeReflected,并在类中添加多个成员变量、六个平凡方法、一个静态变量,一个静态方法,具体代码如下:

14.打坐

晌午睡眼惺松,先不忙爬起来,舒舒服服地坐在床上坐着,挺直脊梁,闭上双眼,神速地用鼻子呼气和吸气,嘴巴微闭。(这么些胸部训练应当像拉风箱一样,迅速而机械地举办)

 1 /**
 2  * 被反射测试的类
 3  * Created by liuwei on 17/4/2.
 4  */
 5 public class BeReflected {
 6     private String field1 = "I am field1";
 7     private String field2 = "I am field2";
 8     private static String staticField = "I am staticField";
 9     private void method1(){
10         Logger.i(BeReflected.class, "I am method1");
11     }
12     private void method1(String param) {
13         Logger.i(BeReflected.class, "I am method1--param = " + param);
14     }
15     private void method2(){
16         Logger.i(BeReflected.class, "I am method2");
17     }
18     public static void staticMethod(){
19         Logger.i(BeReflected.class, "I am staticMethod");
20     }
21 }

15.每日运动

就算你再忙,也要咬牙磨炼,或跑动或键步走或游泳。你一旦对团结体力过于自信,以为年轻就是本钱,不会那么自由倒下,有人可能会跟你急。

  (1)通过反射获取 BeReflected 的Class类型,并将其初叶化。(其中
Logger 是楼主封装的一个日志打印类,无需在意这个细节)

16.午睡20分钟

20分钟左右的小憩是最完美的,它实质上跟午睡一钟头的效能没什么两样。一个钟头对大多数人的话有点长了,睡得太沉,上午或许睡不佳。

1 // 1、通过反射获取BeReflected所属的类
2 Class<?> beReflectedClass = Class.forName("com.liuwei.proxy_hook.reflect.BeReflected");
3 Logger.i(ReflectTest.class, beReflectedClass);
4 
5 // 2、通过反射创建实例化一个类
6 Object beReflected = beReflectedClass.newInstance();
7 Logger.i(ReflectTest.class, beReflected);

17.补铁

只要您体内铁的仓储太低,肢体就不可能打造血液中运输氧气的藻多糖,人就容易觉得累。最好的补铁办法是经过膳食,采纳食物疗法:含铁质丰盛发热有动物肝脏.肾脏;其次是瘦肉.蛋黄.鸡.鱼.虾和豆类。

  输出如下:

18.开车多吃纤维食物

爱人很少吃零食,你可以在车里放些花生和葡萄干,这些事物含有大量的钾,你的血肉之躯急需钾将血液中的糖转化为能量;坚果也没错,它涵盖碳酸镁,缺少碳酸镁会使躯体暴发大量乳酸,而乳酸易使人发出疲劳感。

  [ReflectTest] : class
com.liuwei.proxy_hook.reflect.BeReflected
  [ReflectTest] :
com.liuwei.proxy_hook.reflect.BeReflected@7d4991ad

19.芳香疗法

放些香料在家里,尤其是迷迭香.薄荷和姜,能够提神醒脑,增强记念力,并且能医治高烧偏高烧。

  (2)通过反射访问私有方法和私家成员变量,并更改私有变量的值。大家都了解,对于一个私有类型的变量,在未曾提供公开的
set 之类方法的场馆下,想改变它的值是不容许的,可是采用反射就足以做到。

20.多看正剧

笑一笑,十年少。笑能训练面部肌肉,改变您的颜面循环,从而增强注意力。英帝国数学家最近布告的钻研表明,即便喜欢不像俗语形容的那么能挽留青春,但每日保持快乐心情的人真的更健康,罹患心血管病.糖尿病的高风险更低。

 1 // 3、通过反射调用一个私有方法和成员变量
 2 Method method = beReflectedClass.getDeclaredMethod("method1");
 3 method.setAccessible(true);// 将此值设为true即可访问私有的方法和成员变量
 4 method.invoke(beReflected);// 访问普通成员变量和方法是需要在调用invoke方法是传入该类的对象
 5 
 6 Field field1 = beReflectedClass.getDeclaredField("field1");
 7 field1.setAccessible(true);
 8 Logger.i(ReflectTest.class, "field 改变前的值:" + field1.get(beReflected));
 9 field1.set(beReflected, "我是 field1 被改变后的值");
10 Logger.i(ReflectTest.class, "field 改变后的值:" + field1.get(beReflected));

21.提前1时辰上床

多睡60分钟的提神功能等于喝两杯咖啡。这是指你天天早睡一时辰,而不是周二拼命睡懒觉。否则生物钟被打乱,总感觉天旋地转的。

  输出如下:  

22.和日光玩游戏

美国伊利诺伊高校的探讨讲明,愤怒和敌视的情绪在冬日可比多,而冬天相比少。晒太阳能进步大脑血清素的含量,改正心态,为肢体充电。不妨争取一切能晒太阳的出差或旅行时机。

  [BeReflected] : I am
method1
  [ReflectTest] : field
改变前的值:I am field1
  [ReflectTest] : field
改变后的值:我是 field1 被改动后的值

23.决定酒量

酒精让您发出蒙蒙睡意,可是睡前喝酒反而会因兴奋影响睡眠,虽然闭着眼,眼球却在不停地转。你得牢记睡前两钟头不饮酒,晚餐朗姆酒最三只喝一两杯。

   (3)通过反射访问静态方法和静态变量。访问静态方法和变量时不需要传入所属类的对象,传入
null 即可访问。代码如下:

24.调整健身时间

一项研讨发现,这几个健身族下班后去健身,浑身酸酸地,回家洗个澡睡个好觉,起来后似乎拿到新生,不足为奇,美利坚同盟国马德里学院的学者认为,清晨磨炼能扩展XXXXX素的品位,这对能量的新陈代谢至关首要。

1 // 4、通过反射调用一个静态的方法和变量
2 Method staticMethod = beReflectedClass.getDeclaredMethod("staticMethod");
3 staticMethod.invoke(null);
4 
5 Field staticField = beReflectedClass.getDeclaredField("staticField");
6 staticField.setAccessible(true);
7 Logger.i(ReflectTest.class, staticField.get(null));

25.睡沙发

设若你和情侣吵架,你只可以睡沙发,你绝不内疚或怎样。知道呢,偶尔睡睡沙发对医疗恐怖症有奇效!很六个人都说恐怖症跟我的起居室有关,美利坚合众国的一项调查发现,72%的男人在沙发上睡得正确,只有27%的人说在爱人或女朋友身边睡的还是可以。

作品来源网络

更多内容,可以关心自己的微信公众帐号:Becoming_Casanova

  输出如下:

  [BeReflected] : I am
staticMethod
  [ReflectTest] : I am
staticField

  (4)通过反射访问一个带参数的情势。访问带参数的方法是,需要在
getDeclareMethod 后边传出一组参数的体系。

1 // 5、通过反射访问一个带参数的方法
2 Method method1 = beReflectedClass.getDeclaredMethod("method1", String.class);
3 method1.setAccessible(true);
4 method1.invoke(beReflected, "我是被传入的参数");

  输出如下:

  [BeReflected] : I am
method1–param = 我是被传播的参数

   (5)通过反射获取类中装有的积极分子变量和措施。

1 // 6、遍历类中所有的方法和成员变量
2 for (Method tempMethod : beReflectedClass.getDeclaredMethods()) {
3     Logger.i(ReflectTest.class, tempMethod.getName());
4 }
5 for (Field tempField : beReflectedClass.getDeclaredFields()) {
6     Logger.i(ReflectTest.class, tempField.getName());
7 }

  输出如下:

  [ReflectTest] :
method2
  [ReflectTest] :
method1
  [ReflectTest] :
method1
  [ReflectTest] :
staticMethod
  [ReflectTest] :
field1
  [ReflectTest] :
field2
  [ReflectTest] :
staticField

  看完下面多少个例子之后,你是不是认为反射还真是神奇,可以成功很多用健康办法做不到的操作。当然上边只是示例了反光机制中最基本的部分调用而已,感兴趣的仇人能够活动查阅官方文档。废话不多说了,大家尽快先导介绍
Hook 技术。

二、Hook入门

  Hook 中文释意是“钩子”,这两天楼主也一直在雕琢,Hook
到底指的是哪些?怎么着才能用一种简易易懂,生动形象的表达来提现 Hook
技术?以楼主如今对 Hook
的了然,通俗来将就是经过某种手段对一件事物举行偷梁换柱,从而威吓目的来以达到控制目的的表现的目标。从技术角度来说,就是替换原有的目标,拦截目的函数/方法,从而改变其原有的行为。

  在四月份初刚起初读书 Hook
技术时写了一个关于替换汽车发动机的小例子,今日就把这几个例子贴出来吧。先说一下大概流程,首先我们会有一个简约的汽车类,汽车类里面有个引擎的靶子,当然,汽车发动机都是有正式的(这里即为接口),为简易起见,大家这边的汽车引擎标准暂且只有一个最大速度的目标,后续我们会经过反射机制来替换掉汽车发动机以达成提高最大速度的目标。例子十分简单,通过这些例子我们很容易就能开头的领悟Hook 技术。

  汽车类代码如下:

 1 /**
 2  * Created by liuwei on 17/3/1.
 3  */
 4 public class Car {
 5     private CarEngineInterface carEngine;
 6     public Car() {
 7         this.carEngine = new CarEngine();
 8     }
 9     public void showMaxSpeed(){
10         Logger.i(Car.class, "我卯足劲,玩命跑的最大速度可以达到:" + carEngine.maxSpeed());
11     }
12 }

  可以看来,汽车类里面有一个 carEngine
(汽车引擎)的性能,汽车发动机接口代码如下:

1 /**
2  * 车引擎接口
3  * Created by liuwei on 17/3/1.
4  */
5 public interface CarEngineInterface {
6     int maxSpeed();
7 }

  汽车引擎类代码如下:

/**
 * 车引擎
 * Created by liuwei on 17/3/1.
 */
public class CarEngine implements CarEngineInterface {
    @Override
    public int maxSpeed() {
        return 60;
    }
}

  一个大概的小车搞定了,试跑一下:

1 public class Test {
2     public static void main(String[] args) {
3         Car car = new Car();
4         car.showMaxSpeed();
5     }
6 }

  输出结果:[Car] :
我卯足劲,玩命跑的最大速度可以达成:60

  额…可以吗,卯足劲才能跑到60,这发动机速度有点….,作为一个飙车党,肯定不可以忍,必须改装!

  在改装在此之前,大家需要先考察从何地入手合适,能够看来,在 Car
类里面有个 CarEngine 的靶子,我们需要做的就是将以此 CarEngine
的对象替换成咱们团结一心成立的引擎类,这一个引擎类需要有这和 CarEngine
一样的特点,也就是说需要贯彻 CarEngineInterface 接口或者直接接轨
CarEngine ,然后拦截到 maxSpeed
方法并修改重临值。那么这里大家实际上有二种方案,一种方案,能够再度创立一个引擎类,让其继续
CarEngine 或者实现 CarEngineInterface 都行,然后经过反射来替换 Car
对象中的 carEngine 属性;另一种方案,写一个动态代理,让其对 CarEngine
举办代理,然后用反射替换。

  先是种方案:

  首先成立一个 EvilCarEngine 类, 详细代码如下:

 1 /**
 2  * Created by liuwei on 17/3/1.
 3  */
 4 public class EvilCarEngine extends CarEngine {
 5     private CarEngineInterface base;
 6     public EvilCarEngine(CarEngineInterface base) {
 7         this.base = base;
 8     }
 9     public int maxSpeed() {
10         return 3 * base.maxSpeed();
11     }
12 }

  然后用反射机制替换掉原来的汽车引擎。

 1 public class Test {
 2     public static void main(String[] args) {
 3         Car car = new Car();
 4         Logger.i(Test.class, "------------------替换前----------------");
 5         car.showMaxSpeed();
 6         // 怎样在不手动修改CarEngine类和Car类的情况下将大速度提高?
 7         try {
 8             Field carEngineField = Car.class.getDeclaredField("carEngine");
 9             carEngineField.setAccessible(true);
10             CarEngine carEngine = (CarEngine)carEngineField.get(car);
11             // 方法1
12             carEngineField.set(car, new EvilCarEngine(carEngine));
13         } catch (Exception e) {
14             e.printStackTrace();
15         }
16         Logger.i(Test.class, "------------------替换后----------------");
17         car.showMaxSpeed();
18     }
19 }

   输出结果:

  [Test] :
——————替换前—————-
  [Car] :
我卯足劲,玩命跑的最大速度可以达到:60
  [Test] :
——————替换后—————-
  [Car] :
我卯足劲,玩命跑的最大速度可以达标:180

  第二种方案:

  首先创设一个动态代理类,并截留 maxSpeed 方法,修改重回值。

 1 /**
 2  * Created by liuwei on 17/3/1.
 3  */
 4 public class CarEngineProxyHandler implements InvocationHandler {
 5     private Object object;
 6     public CarEngineProxyHandler(Object object) {
 7         this.object = object;
 8     }
 9     @Override
10     public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
11         if ("maxSpeed".equals(method.getName())) {
12             Logger.i(CarEngineProxyHandler.class, "我是动态代理,我已拦截到 maxSpeed 方法,并偷偷返回了另一个值!");
13             return 180;
14         }
15         return method.invoke(object, args);
16     }
17 }

   同理,利用反射替换掉原来的汽车引擎

 1 public class Test {
 2     public static void main(String[] args) {
 3         Car car = new Car();
 4         Logger.i(Test.class, "------------------替换前----------------");
 5         car.showMaxSpeed();
 6         // 怎样在不手动修改CarEngine类和Car类的情况下将大速度提高?
 7         try {
 8             Field carEngineField = Car.class.getDeclaredField("carEngine");
 9             carEngineField.setAccessible(true);
10             CarEngine carEngine = (CarEngine)carEngineField.get(car);
11             // 方法2
12             CarEngineInterface carEngineProxy = (CarEngineInterface) Proxy.newProxyInstance(
13                     CarEngine.class.getClassLoader(), 
14                     new Class[]{CarEngineInterface.class}, 
15                     new CarEngineProxyHandler(carEngine));
16             carEngineField.set(car, carEngineProxy);
17 
18         } catch (Exception e) {
19             e.printStackTrace();
20         }
21 
22         Logger.i(Test.class, "------------------替换后----------------");
23         car.showMaxSpeed();
24     }
25 }

  输出结果与方案一一致。

  写到这里,Hook 的为主用法也一度写完了,看完例子之后,或许你早就对
Hook 有了一个主导的认识,但值得一提的是,在 Test
类中的第10行代码中大家率先取出了 Car 中的 carEngine
对象,然后将此目的传入了它的牺牲品中,为何要这么做的,在替身中不扩散
carEngine 或者另行 new 一个新的 CarEngine
不好吗?这是一个关键点,大家需要领悟的是,这里我们只是想修改一下发动机的最大速度,而并不指望引擎的别样性能受到震慑,大家把从
Car 中取出原有的 carEngine
对象传入替身中,这样替身就足以只选拔我们关注的艺术举办修改,对于我们不想修改的格局直接调用传经来的
carEngine
对艺术即可。因为这里的例证为了简单起见没有添加任何的法子和总体性,所以这或多或少亟待重点表达一下。

三、小结

  其实 Hook 技术简单的话可以用替换、拦截来形容,并不曾采用新技巧。Hook
本身并不难,它的难题在于你在对一段代码 Hook 往日需要找出一个恰如其分的 Hook
点,也就是说分析出从哪出手很重点,这就要求您对将要 Hook
的对象代码的实施流程非凡熟识。本篇博文只是最先认识一下 Hook
技术,下一篇博文将会介绍如何通过 Hook 技术阻碍 Android 中 startActivity
方法,并在分析的历程中介绍怎样才是恰如其分的 Hook
点。感兴趣的爱侣可以关注一下,敬请期待!

本文地址:http://www.cnblogs.com/codingblock/p/6642476.html