Android插件化開發(fā)基礎(chǔ)之Java反射機(jī)制研究

一、獲得Class對(duì)象

Class<?> c = Class.forName("classname");   拋出ClassNotFoundException

二、獲得實(shí)現(xiàn)接口

    Class<?> inters[] = c.getInterfaces();
    for(int i=0;i<inters.length;i++){
        System.out.print(inters[i].getName()+" ");        //getName()方法為取得接口名稱;
    }

三、獲得父類

    Class<?> superClass  = c.getSuperclass();     //獲得父類
    String name  = superClass.getName();    //獲得父類名稱

四、取得構(gòu)造方法

    Constructor cons[] = c.getConstructors();         //獲得公開的構(gòu)造方法
    Constructor dcons[] = c.getDeclaredConstructors();        //獲得全部構(gòu)造方法
    String modifier = Modifier.toString(cons[i].getModifiers());   //獲得訪問權(quán)限
    String name = cons[i].getName();            //獲得構(gòu)造方法名稱
    Class<?> params[] = cons[i].getParameterTypes();        //獲得參數(shù)類型對(duì)象

五、獲得Method

    Method ms[] = c.getMethods();                        //返回公共的全部方法,包括繼承方法
    Method dms[] = c.getDeclaredMethods();        //返回本類全部方法,不包括繼承的方法
    Class<?> rt = ms[i].getReturnType();
    Class<?>params[] = ms[i].getParameterTypes();
    String name = ms[i].getName();
    String modifier = Modifier.toString(ms[i].getModifiers());
    Class<?>ex[] = ms[i].getExceptionTypes();        //獲得異常
    String name = ex[i].getName();            //獲得異常名稱

六、獲得Field

    Field fs[] = c.getFields();                    //獲得公共屬性,包括繼承屬性
    Field dfs[] = c.getDeclaredFields();    // 獲得本類全部屬性
    Class<?> type = fs[i].getType();        //獲得屬性的類型對(duì)象
    String name = fs[i].getName();        //獲得屬性的名稱
    String modifier = Modifier.toString(fs[i].getModifiers());

七、通過反射創(chuàng)建一個(gè)對(duì)象

    (1)
    Class<?> c = Class.forName("Person");
    Person p = (Person)c.newInstance();
    (2)
    Constructor con = c1.getConstructor(Class....param);
    Object obj = con.newInstance(Object obj);  //根據(jù)構(gòu)造函數(shù)創(chuàng)建一個(gè)實(shí)例
     
    八、Constructor創(chuàng)建對(duì)象
    Class c = Class.forName("Person");
    Constructor<?> cons[] = c.getConstructors();
    Person p = (Person)cons[0].newInstance("xiazdong",15);
    注:如果調(diào)用的構(gòu)造函數(shù)為私有,則需要c.setAccessible(true);

九、調(diào)用特定方法
Method m = c1.getMethod("funcname",Class<?>...c);   //funcname表示調(diào)用方法的名稱,c表示參數(shù)的Class對(duì)象
例如:Method m = c1.getMethod("fun",String.class,int.class);    表示調(diào)用fun(String,int);函數(shù)
Object obj = m.invoke(c1.newInstance(),"xiazdong",20);   //如果有返回值,則invoke函數(shù)返回;
注:如果是調(diào)用靜態(tài)的方法,則不需要設(shè)置對(duì)象;
Object obj = m.invoke(null,"xiazdong");

注:如果參數(shù)中有數(shù)組,比如 public static void main(String[]args);

Method m = c1.getMethod("main",String[].class);
m.invoke(null,(Object)new String[]{"aa","bb"});是對(duì)的;
m.invoke(null,new String[]{"aa","bb"}); 會(huì)調(diào)用 main(String,String);函數(shù);

十、調(diào)用特定屬性
Field f = c1.getDeclaredField("name");    //返回name屬性
f.setAccessible(true);    //私有屬性可見
String name = (String)f.get(Object obj);   //返回obj對(duì)象的name屬性的值
f.set(Object obj,String n);      //設(shè)置obj對(duì)象的name屬性為n值;

十一、操作數(shù)組
int tmp[] = {1,2,3};
Class<?> c  = tmp.getClass().getComponentType();
Array.getLength(tmp);        //tmp數(shù)組的長度
c.getName();           //獲得數(shù)組類型名稱
Array.get(Object obj,int index);      //獲得obj數(shù)組的index索引的數(shù)值
Array.set(Object obj,int index,VALUE);    //設(shè)置obj數(shù)組的index索引的數(shù)值為value;
Object obj  = Array.newInstance(c,length);          //c為數(shù)組的類型,length為數(shù)組的長度;obj為返回的數(shù)組對(duì)象;


    import java.lang.reflect.*;  
    public class GetMethodDemo01{  
        public static void main(String args[])throws Exception{  
            Class<?> c1 = Class.forName("Person");  
            Method m = c1.getMethod("sayHello");  
            m.invoke(c1.newInstance());  
            Method m2 = c1.getMethod("sayHello2",String.class,int.class);  
            String str = (String)m2.invoke(c1.newInstance(),"xiazdong",123);  
            System.out.println(str);  
            Field nameField = c1.getDeclaredField("name");  
            Field ageField = c1.getDeclaredField("age");  
            nameField.setAccessible(true);  
            ageField.setAccessible(true);  
            Person obj = (Person)c1.newInstance();  
            obj.setName("xzdong");  
            obj.setAge(12);  
            System.out.println(nameField.get(obj));  
            System.out.println(ageField.get(obj));  
            Method setName = c1.getMethod("setName",String.class);  
            setName.invoke(obj,"changed");  
            Method getName = c1.getMethod("getName");  
            System.out.println(getName.invoke(obj));  
      
            int tmp[] = {1,2,3};  
            Class<?> c3 = tmp.getClass().getComponentType();  
            System.out.println(c3.getName());  
            System.out.println("第一個(gè)數(shù):"+Array.get(tmp,0));  
            Array.set(tmp,0,5);  
            System.out.println("第一個(gè)數(shù):"+Array.get(tmp,0));  
      
            Object arr = Array.newInstance(c3,5);  
            System.arraycopy(tmp,0,arr,0,Array.getLength(tmp));  
            System.out.println(Array.get(arr,2));  
            System.out.println(Array.get(arr,3));  
        }  
    }  

    import java.lang.reflect.*;
    public class GetMethodDemo01{
        public static void main(String args[])throws Exception{
            Class<?> c1 = Class.forName("Person");
            Method m = c1.getMethod("sayHello");
            m.invoke(c1.newInstance());
            Method m2 = c1.getMethod("sayHello2",String.class,int.class);
            String str = (String)m2.invoke(c1.newInstance(),"xiazdong",123);
            System.out.println(str);
            Field nameField = c1.getDeclaredField("name");
            Field ageField = c1.getDeclaredField("age");
            nameField.setAccessible(true);
            ageField.setAccessible(true);
            Person obj = (Person)c1.newInstance();
            obj.setName("xzdong");
            obj.setAge(12);
            System.out.println(nameField.get(obj));
            System.out.println(ageField.get(obj));
            Method setName = c1.getMethod("setName",String.class);
            setName.invoke(obj,"changed");
            Method getName = c1.getMethod("getName");
            System.out.println(getName.invoke(obj));
     
            int tmp[] = {1,2,3};
            Class<?> c3 = tmp.getClass().getComponentType();
            System.out.println(c3.getName());
            System.out.println("第一個(gè)數(shù):"+Array.get(tmp,0));
            Array.set(tmp,0,5);
            System.out.println("第一個(gè)數(shù):"+Array.get(tmp,0));
     
            Object arr = Array.newInstance(c3,5);
            System.arraycopy(tmp,0,arr,0,Array.getLength(tmp));
            System.out.println(Array.get(arr,2));
            System.out.println(Array.get(arr,3));
        }
    }

    import java.lang.reflect.*;  
    interface China{  
        public static final String NAME = "CHINA";  
        public int AGE = 60;  
        public void sayHello();  
        public String sayHello2(String name,int age);  
    }  
    class Person implements China{  
        private String name;  
        private int age;  
        public String getName(){  
            return name;  
        }  
        public void setName(String name){  
            this.name = name;  
        }  
        public int getAge(){  
            return age;  
        }  
        public void setAge(int age){  
            this.age = age;  
        }  
        public void sayHello(){  
            System.out.println(NAME+"  "+AGE);  
        }  
        public String sayHello2(String name,int age){  
            return name+" "+age;  
        }  
    }  


    import java.lang.reflect.*;  
    interface China{  
        public static final String NAME = "CHINA";  
        public int AGE = 60;  
        public void sayHello();  
        public String sayHello2(String name,int age);  
    }  
    class Person implements China{  
        private String name;  
        private int age;  
        public String getName(){  
            return name;  
        }  
        public void setName(String name){  
            this.name = name;  
        }  
        public int getAge(){  
            return age;  
        }  
        public void setAge(int age){  
            this.age = age;  
        }  
        public void sayHello(){  
            System.out.println(NAME+"  "+AGE);  
        }  
        public String sayHello2(String name,int age){  
            return name+" "+age;  
        }  
    }  



作者:chen.yu
深信服三年半工作經(jīng)驗(yàn),目前就職游戲廠商,希望能和大家交流和學(xué)習(xí),
微信公眾號(hào):編程入門到禿頭 或掃描下面二維碼
零基礎(chǔ)入門進(jìn)階人工智能(鏈接)