--摘自《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. 年底Android面试整理(附答案)

    面试,无非都是问上面这些问题(挺多的 - -!),聘请中高级的安卓开发会往深的去问,并且会问一延伸二.以下我先提出几点重点,是面试官基本必问的问题,请一定要去了解! 基础知识 – 四大组件(生命周期, ...

  2. Java.ftp上传下载

    1:jar的maven的引用: 1 <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="ht ...

  3. maven添加镜像与常用配置

    maven解压后conf文件夹有个 settings.xml 在这个文件中可以配置我们的maven 配置镜像: 找到<mirrors></mirrors>找到这个节点在节点中添 ...

  4. Python实战二

    要求:按照要求完成对文件的增.删.改.查操作. def add(**kwargs): '''新增内容,在指定位置新增''' while True: flag = False with open(&qu ...

  5. AppServ安装到一半卡住的问题

    今天在笔记本安装AppServ的时候,运行到Installing mysql service时就卡住不动了,因为之前在自己的台式电脑安装过AppServ,当时是一步成功的,所以觉得这个问题莫名其妙,因 ...

  6. php 重要函数归集

    1.json_encode 与 json_decode json_encode 把数组转化成字符串 json_encode(array) json_decode 把目标字符串转成数组json_deco ...

  7. Python集合(set)

    Python中的集合同数学中的集合概念类似,也是用于保存不重复的元素.他有可变集合(set),和不可变集合(frozenset);可变集合(set)是无序的可变的. 创建集合 直接使用{}创建 set ...

  8. php安装扩展

    php安装扩展 以前以为php的扩展要重新编译php,今天在群友的指点下知道可以像apache模块一样动态扩展,以mcrypt举例. 进入要安装的扩展的源码目录cd /root/php-5.2.6/e ...

  9. 出现xml错误的时候都是配置文件的名字没有改造成的

    The error may exist in com/bjpowernode/dao/PlayerDao.xml

  10. vetur插件提示 [vue-language-server] Elements in iteration expect to have 'v-bind:key' directives错误的解决办法

    错误提示: [vue-language-server] Elements in iteration expect to have 'v-bind:key' directives.Renders the ...