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)階人工智能(鏈接)