--摘自《android插件化开发指南》

1.jOOR库就一个Reflect.java类很重要

2.Reflect.java包括6个核心方法

  1)on:包裹一个类或者对象,表示在这个类或对象上进行反射

  2)create:用来调用之前的类的构造方法

  3)call:方法调用

  4)get:获取(field和method返回)值

  5)set:设置属性值

No1:

根据字符串获取一个类

import static com.example.reflectiontest.Reflect.on;

Reflect r1 = on(Object.class);
Reflect r2 = on("java.lang.Object");
Reflect r3 = on("java.lang.Object",ClassLoader.getSystemClassLoader()); Object o1 = on(Object.class).<Object>get();
Object o2 = on("java.lang.Object").get(); String j2 = on((Object)"abc").get();
int j3 = on(1).get(); System.out.println(r1.toString());
System.out.println(r2.toString());
System.out.println(r3.toString());
System.out.println(o1.toString());
System.out.println(o2.toString());
System.out.println(j2.toString());
System.out.println(j3);
----------------------
class java.lang.Object
class java.lang.Object
class java.lang.Object
class java.lang.Object
class java.lang.Object
abc
1

No2:

调用类的构造函数

public class TestClassCtor {
private static String name; public TestClassCtor() {
name = "baobao";
} public TestClassCtor(int a) { } public TestClassCtor(int a, String b) {
name = b;
} private TestClassCtor(int a, double c) { } @Override
public String toString() {
return name;
} public static String getName() {
return name;
}
}
TestClassCtor r = new TestClassCtor();
Class temp = r.getClass();
String className = temp.getName();
System.out.println(className); //public构造函数
Object obj = on(temp).create().get();//无参
Object obj2 = on(temp).create(1, "abc").get();//有参
System.out.println("obj:" + obj.toString());
System.out.println("obj2:" + obj2.toString()); //private构造函数
TestClassCtor obj3 = on(TestClassCtor.class).create(1, 1.1).get();
String a = obj3.getName();
System.out.println("a:" + a);
----------------
com.example.reflectiontest.TestClassCtor
obj:abc
obj2:abc
a:abc

No3:

调用类的私有方法

public class TestClassCtor {
private static String name; public TestClassCtor() {
name = "baobao";
} public TestClassCtor(int a) { } public TestClassCtor(int a, String b) {
name = b;
} private TestClassCtor(int a, double c) { } private String doSomething(String d) {
System.out.println("TestClassCtor,doSomething");
return "123" + d;
}
}
TestClassCtor r = new TestClassCtor();
Class temp = r.getClass();
Reflect reflect = on(temp).create(); String a1 = reflect.call("doSomething", "param1").get();
System.out.println(a1);
------------------
TestClassCtor,doSomething
123param1

No4:

调用类的私有静态方法

public class TestClassCtor {
private static String name; public TestClassCtor() {
name = "baobao";
} public TestClassCtor(int a) { } public TestClassCtor(int a, String b) {
name = b;
} private TestClassCtor(int a, double c) { } private static void work() {
System.out.println("TestClassCtor,work");
}
}
TestClassCtor r = new TestClassCtor();
Class temp = r.getClass();
Reflect reflect = on(temp).create(); on(TestClassCtor.class).call("work").get();
-------------------
TestClassCtor,work

No5:

修改类的私有实例字段

public class TestClassCtor {
private String name; public TestClassCtor() {
name = "baobao";
} public TestClassCtor(int a) { } public TestClassCtor(int a, String b) {
name = b;
} private TestClassCtor(int a, double c) { }
}
Reflect obj = on("com.example.reflectiontest.TestClassCtor").create(1, 1.1);
obj.set("name", "jianqiang");
Object obj1 = obj.get("name");
System.out.println(obj1.toString());
----------------------
jianqiang

No6:

修改类的私有静态字段

public class TestClassCtor {
private String name;
private static String address; public TestClassCtor() {
name = "baobao";
} public TestClassCtor(int a) { } public TestClassCtor(int a, String b) {
name = b;
} private TestClassCtor(int a, double c) { }
}
on("com.example.reflectiontest.TestClassCtor").set("address","avccccc");
Object obj2 = on("com.example.reflectiontest.TestClassCtor").get("address");
System.out.println(obj2.toString());
------------------
avccccc

问题:为什么jOOR不支持final字段

因为jOOR的Reflect的set方法会在遇到final时,尝试反射出Field类的modifiers字段,在Java环境下是有这个字段的,但是Android版本的Field并没有这个字段,于是就报错NoSuchFeildException

jOOR的更多相关文章

  1. java joor 实现反射简单调用

    有时候需要用反射实现代码.直接用工具,joor 上代码: package com.ming.joor; import static org.joor.Reflect.*; public class T ...

  2. 2013-07-29 IT 要闻速记快想

    ### ========================= ###传动视暴雪82亿美元赎身,腾讯参与投资 ### ========================= ###帮助企业解决打印&邮 ...

  3. 时尚B2B方兴未艾-Maker’s Row 获100万美元种子投资 |华丽志

    时尚B2B方兴未艾-Maker's Row 获100万美元种子投资 |华丽志 华丽志 » 网internet, 时尚B2B方兴未艾-Maker's Row 获100万美元种子投资 由 luxeco 发 ...

  4. Android开发技术周报

    Android开发技术周报 原文  http://androidweekly.cn/android-dev-weekly-issue48/ 教程 深入理解Android之Gradle Gradle是当 ...

  5. 《Android插件化开发指南》面世

    本书在京东购买地址:https://item.jd.com/31178047689.html 本书Q群:389329264 (一)这是一本什么书 如果只把本书当作纯粹介绍Android插件化技术的书籍 ...

  6. 包建强的培训课程(16):Android新技术入门和提高

    @import url(/css/cuteeditor.css); Normal 0 10 pt 0 2 false false false EN-US ZH-CN X-NONE $([{£¥·‘“〈 ...

  7. Web - JSONP和同源策略漫谈

    0x00 前言 关于JSONP网上有很多文章了,我也是在拜读了别人的文章的基础上来写写自己的看法,这样可以加深自己印象,巩固一下学习效果.我们需要做的就是站在巨人的肩膀上眺望远方. 0x01 起 在W ...

  8. JAVA自学日记——Part Ⅲ

    终于来到了可视化窗口制作的部分了,从学习JAVA之前,到开始入手学习,一直到现在,都在盼望着有一天可以自己写出一款有界面而且是很美观的应用程序,今天算是一个真正开始的时间节点,值得纪念. 内容有很多, ...

  9. 利用反射修改final数据域

    当final修饰一个数据域时,意义是声明该数据域是最终的,不可修改的.常见的使用场景就是eclipse自动生成的serialVersionUID一般都是final的. 另外还可以构造线程安全(thre ...

随机推荐

  1. C# 制作向导

    1.FormBase界面:有“帮助,上一步,下一步,取消”按钮,这些按钮放置在一个Panel上. namespace DataBase {     public partial class FormB ...

  2. android招聘啦,美图秀秀欢迎你加入!

    前言 最近朋友公司招聘,美图秀秀大家一定很熟悉吧,欢迎你的加入. 了解相关更多技术以外的,可参考<除了敲代码,你还有什么副业吗?>,再往下看,今天给需要换工作或者还未找到工作的童鞋们谋一个 ...

  3. yun

    # Author:zhang# -*- coding:utf-8 -*-"""https://workyun.com/ 云端工作"""imp ...

  4. 修改 sql 提示符信息:

    Last login: Thu Dec 8 19:18:08 2016 from 192.168.242.1 [root@localhost ~]# su - oracle [oracle@local ...

  5. Confluence 6 启用主题评论

    页面或者博客页面中显示的评论以下面 2 种方式显示: 主题模式(Threaded):以继承回复的方式显示页面的评论.每一回复的评论将会在不同评论之间显示,以表示各个评论之间的关系. 平面模式(Flat ...

  6. vue阿里上传图片报400错误

    首先我用vue上传阿里图片用的是分片上传,分片上传由于一片是以100kb为起始的,所以当图片大小小于100kb的时候不分片,可以正常上传,当大于100kb的时候,会报400错误如下 One or mo ...

  7. 【sqli-labs】Less18~Less22

    Less18: User-Agent注入,有错误回显 感叹一句,越来越难了.现在只能先看代码再分析怎么注入了..... 通过代码,发现username和password均做了校验.但是会有一个插入us ...

  8. java 自动包装功能

    基本类型直接存储在堆栈中 基本类型所具有的包装容器,使得可以在堆中创建一个非基本对象,用来表示对应的基本类型 基本类型与包装容器类对应如下:boolean Booleanbyte Byte short ...

  9. 反序列化json的坑

    json格式没有错误,内容没有什么异常 反序列化一直显示第一行有异常符号, 在https://jsonlint.com/上面检测了一下,发现了这个 解决办法: UTF-8格式编码 改成 UTF-8无B ...

  10. 步步为营103-ZTree 二级联动

    1:添加引用 <%--流程类别多选--引用js和css文件--开始--%> <link rel="stylesheet" href="../css/zT ...