JAVA的反射 Android的模块化组件必备

作者: 3c2cf1f7612e | 来源:发表于2017-10-17 14:06 被阅读101次

在Android中的组件化开发,在我的理解来说就是想要你就加进来不要的话就直接删除,所以直接添加类这一方法是不行的,而Java的反射对我们来说,是很好的支持。只不过两个模块之间要继承同一个类,这样子才能实现。

下面是反射的代码:


public class One {

    public String aa="aa";
    public  static String bb="static";
    private String priva="private";
    String defaul="default";
    
    public String getAa() {
        System.out.print("  getAa"+aa);
        return aa;
    }
    public void setAa(String aa) {
        System.out.print("  setAa"+aa);

        this.aa = aa;
    }
    public static String getBb() {
        System.out.print("  getBb"+bb);
        return bb;
    }
    public static void setBb(String bb ,String cc) {
        System.out.print("  setBb"+bb+"  "+cc);
        One.bb = bb;
    }
    
    
}

关键部分:


public class Text {
    static One one;
    @SuppressWarnings("null")
    public static void main(String[] args) throws Exception {
             one =new One();
            String aa=(String) getProperty(one, "bb");
            System.out.print(aa);   
            
//          String bb=(String) getClassStatic("One", "bb");        
//          oBjectMethod("cc" ,"马丹");
//          classMethod("类","静态方法");
        Object object=one;
            invokeStaticMethod("One","setBb","实验","中心");        
            
            if (object instanceof One) {
                System.err.print("是可以的");
            }
    }
    
    static void oBjectMethod(Object... args) throws Exception{
//      invokeMethod(one,"getAa",args);
        invokeMethod(one,"setBb",args);
    }
    
    /**
     * 得到对象的属性  {类的静态属性也是可以拿到的}
     * */
    public static Object getProperty(Object owner,String  fieldName) throws Exception {
        //得到该对象的Class
        Class<?> owerClass=owner.getClass();
        //通过Class得到Class得到类声明的属性
        Field field=owerClass.getField(fieldName);
        //通过对象得到该属性的实例,如果这个属性是非公有的,这里会报IllegalAccessException。
        Object prObject=field.get(owner);
        return prObject;
    }
    /**
     * 执行某对象的方法
     * */
    public static Object invokeMethod(Object owner,String methodName,Object[] args)throws Exception {
        Class<?> ownerClass=owner.getClass();   
        Class<?>[] argsClass=new Class<?>[args.length];
        for (int i = 0; i < args.length; i++) {
            argsClass[i] =args[i].getClass();
        }
        Method method=ownerClass.getMethod(methodName, argsClass);
        return method.invoke(owner, args);
    }
    /**
     *  得到某个类的静态属性 
     * */
    public static Object getClassStatic(String owerClass,String fieldName)throws Exception{
        Class<?> oClass =Class.forName(owerClass);
        Field field=oClass.getField(fieldName);
        Object objec=field.get(fieldName);
        return objec;   
    }
    static void classMethod(Object... args) throws Exception{
        invokeStaticMethod("One","setBb",args);
    }
    /**
     * 得到某个类的静态方法
     * methodName:方法名
     * args:参数
     * 
     * */
    public static Object invokeStaticMethod(String className,String methodName,Object... args)throws Exception{
        Class<?> oneClass=Class.forName(className);
        Class<?>[] argsClass=new Class<?>[args.length]; 
        for(int i=0;i<argsClass.length;i++){
            argsClass[i]=args[i].getClass();
        }
        
        Method method=oneClass.getMethod(methodName, argsClass);
        return method.invoke(null, args);
        
    }
    
}

相关文章

网友评论

    本文标题:JAVA的反射 Android的模块化组件必备

    本文链接:https://www.haomeiwen.com/subject/ycrduxtx.html