Android插件化开发基础之Java反射机制研究
一、獲得Class對象
?
Class<?> c = Class.forName("classname"); 拋出ClassNotFoundException?
?
二、獲得實現接口
?
?
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(); //獲得父類名稱?
?
?
?
四、取得構造方法
Constructor cons[] = c.getConstructors(); //獲得公開的構造方法 Constructor dcons[] = c.getDeclaredConstructors(); //獲得全部構造方法 String modifier = Modifier.toString(cons[i].getModifiers()); //獲得訪問權限 String name = cons[i].getName(); //獲得構造方法名稱 Class<?> params[] = cons[i].getParameterTypes(); //獲得參數類型對象
五、獲得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
?
?
七、通過反射創建一個對象
(1) Class<?> c = Class.forName("Person"); Person p = (Person)c.newInstance(); (2) Constructor con = c1.getConstructor(Class....param); Object obj = con.newInstance(Object obj); //根據構造函數創建一個實例八、Constructor創建對象 Class c = Class.forName("Person"); Constructor<?> cons[] = c.getConstructors(); Person p = (Person)cons[0].newInstance("xiazdong",15); 注:如果調用的構造函數為私有,則需要c.setAccessible(true);?
?
?
?
?
?
?
九、調用特定方法
Method m = c1.getMethod("funcname",Class<?>...c); ? //funcname表示調用方法的名稱,c表示參數的Class對象
例如:Method m = c1.getMethod("fun",String.class,int.class); ? ?表示調用fun(String,int);函數
Object obj = m.invoke(c1.newInstance(),"xiazdong",20); ? //如果有返回值,則invoke函數返回;
注:如果是調用靜態的方法,則不需要設置對象;
Object obj = m.invoke(null,"xiazdong");
注:如果參數中有數組,比如 public static void main(String[]args);
則
Method m = c1.getMethod("main",String[].class);
m.invoke(null,(Object)new String[]{"aa","bb"});是對的;
m.invoke(null,new String[]{"aa","bb"}); 會調用 main(String,String);函數;
十、調用特定屬性
Field f = c1.getDeclaredField("name"); ? ?//返回name屬性
f.setAccessible(true); ? ?//私有屬性可見
String name = (String)f.get(Object obj); ? //返回obj對象的name屬性的值
f.set(Object obj,String n); ? ? ?//設置obj對象的name屬性為n值;
十一、操作數組
int tmp[] = {1,2,3};
Class<?> c ?= tmp.getClass().getComponentType();
Array.getLength(tmp); ? ? ? ?//tmp數組的長度
c.getName(); ? ? ? ? ? //獲得數組類型名稱
Array.get(Object obj,int index); ? ? ?//獲得obj數組的index索引的數值
Array.set(Object obj,int index,VALUE); ? ?//設置obj數組的index索引的數值為value;
Object obj ?= Array.newInstance(c,length); ? ? ? ? ?//c為數組的類型,length為數組的長度;obj為返回的數組對象;
?
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("第一個數:"+Array.get(tmp,0)); Array.set(tmp,0,5); System.out.println("第一個數:"+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("第一個數:"+Array.get(tmp,0));Array.set(tmp,0,5);System.out.println("第一個數:"+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; } }?
?
?
?
?
?
?
?
?
?
?
?
?
總結
以上是生活随笔為你收集整理的Android插件化开发基础之Java反射机制研究的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Android之可伸缩的皮筋效果(贝塞尔
- 下一篇: Android之React Native