jOOR
--摘自《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的更多相关文章
- java joor 实现反射简单调用
有时候需要用反射实现代码.直接用工具,joor 上代码: package com.ming.joor; import static org.joor.Reflect.*; public class T ...
- 2013-07-29 IT 要闻速记快想
### ========================= ###传动视暴雪82亿美元赎身,腾讯参与投资 ### ========================= ###帮助企业解决打印&邮 ...
- 时尚B2B方兴未艾-Maker’s Row 获100万美元种子投资 |华丽志
时尚B2B方兴未艾-Maker's Row 获100万美元种子投资 |华丽志 华丽志 » 网internet, 时尚B2B方兴未艾-Maker's Row 获100万美元种子投资 由 luxeco 发 ...
- Android开发技术周报
Android开发技术周报 原文 http://androidweekly.cn/android-dev-weekly-issue48/ 教程 深入理解Android之Gradle Gradle是当 ...
- 《Android插件化开发指南》面世
本书在京东购买地址:https://item.jd.com/31178047689.html 本书Q群:389329264 (一)这是一本什么书 如果只把本书当作纯粹介绍Android插件化技术的书籍 ...
- 包建强的培训课程(16):Android新技术入门和提高
@import url(/css/cuteeditor.css); Normal 0 10 pt 0 2 false false false EN-US ZH-CN X-NONE $([{£¥·‘“〈 ...
- Web - JSONP和同源策略漫谈
0x00 前言 关于JSONP网上有很多文章了,我也是在拜读了别人的文章的基础上来写写自己的看法,这样可以加深自己印象,巩固一下学习效果.我们需要做的就是站在巨人的肩膀上眺望远方. 0x01 起 在W ...
- JAVA自学日记——Part Ⅲ
终于来到了可视化窗口制作的部分了,从学习JAVA之前,到开始入手学习,一直到现在,都在盼望着有一天可以自己写出一款有界面而且是很美观的应用程序,今天算是一个真正开始的时间节点,值得纪念. 内容有很多, ...
- 利用反射修改final数据域
当final修饰一个数据域时,意义是声明该数据域是最终的,不可修改的.常见的使用场景就是eclipse自动生成的serialVersionUID一般都是final的. 另外还可以构造线程安全(thre ...
随机推荐
- Ubuntu16.04安装MySQL
本篇教程在示例步骤中使用了以下版本的软件.操作时,请您以实际软件版本为准. 操作系统:Ubuntu 16.04.3 LTS (GNU/Linux 4.4.0-105-generic x86_64) ...
- Confluence 6 log4j 日志级别
日志级别 DEBUG - 被设计为用来获得最多的信息和事件,在对应用程序进行调试的时候,这个日志级别通常能够提供最多的有效信息(查看应用程序怎么了) INFO - 有关系统正常运行-计划任务运行,服务 ...
- Confluence 6 workbox 包含从 Jira 来的通知
如果你的 Confluence 站点链接了一个 Jira 应用,你可以包含从 Jira 应用来的通知,例如 Jira 软化或 Jira 服务器桌面. 希望包含有从 Jira 应用来的通知: 你的 Ji ...
- Confluence 6 用自带的用户管理
在一些特定的情况下,你可能希望禁用 Confluence 自带的用户管理或完全使用外部的用户目录进行用户管理.例如 Jira 软件或者 Jira Service Desk.你可以在 Confluenc ...
- gnuradio 打包脚本
#!/bin/sh echo "cd build" cd build echo "rm -rf **" rm -rf ** echo "cmake . ...
- list的add()方法与addAll()方法简介
简单描述:月读别人的代码,发现了一个有意思的东西,list的一个方法,addAll(),然后就去度娘了一下,发现这个还挺有用的. 吐槽一下:为什么自己没发现这个方法呢?因为平时自己写list的时候,基 ...
- PDF文件如何标注,怎么使用PDF标注工具
我们在使用文件的时候需要给文件的部分添加标注,能够更加直观的了解文件,但是有很多小伙伴们对于PDF文件怎么添加标注都不知道,也不知道PDF标注工具要怎么使用,那么下面就跟大家分享一下怎么使用PDF标注 ...
- python WebDriver如何处理右键菜单
WebDriver如何处理右键菜单 一.背景 在学习selenium webdriver的过程中,遇到这样一个问题.ActionChains类中提供了context_click的方法,它可以用来在we ...
- ubuntu下使用matplotlib绘图无法显示中文label
原因是字体导致的.大家的做法基本都是搞一个windows上的字体文件(simhei.ttf, 点我fq下载)然后刷新一下缓存文件. 只不过百度搜到第一篇CSDN的博客,写的很不靠谱(不是所有的CSDN ...
- Nancy 寄宿OWin
一:创建一个空项目 二:安装模板 Install-Package Nancy Install-Package Nancy.Owin Install-Package Microsoft.Owin ins ...