zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    GFS读后笔记
    BigTable读后笔记
    恢复系统基础理论
    事务基础理论
    ARIES算法简介
    怎么快速构建自己的C/C++程序?——有关编译、静态链接和SCons
    lua学习笔记
    运行时动态伪造vsprintf的va_list
    11月30日站立会议
    11月29号站立会议
  • 原文地址:https://www.cnblogs.com/anni-qianqian/p/10087980.html
Copyright © 2011-2022 走看看