Android插件化开发基础之Java反射机制研究

举报
chenyu 发表于 2021/07/27 00:32:33 2021/07/27
【摘要】 一、获得Class对象   Class<?> c = Class.forName("classname"); 抛出ClassNotFoundException     二、获得实现接口     Class<?> inters[] = c.getInterfaces();for(int...

一、获得Class对象

 

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

 

 

二、获得实现接口

 

 


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

 

 

三、获得父类


  
  1. Class<?> superClass = c.getSuperclass(); //获得父类
  2. String name = superClass.getName(); //获得父类名称

 

 

 

 

四、取得构造方法


  
  1. Constructor cons[] = c.getConstructors(); //获得公开的构造方法
  2. Constructor dcons[] = c.getDeclaredConstructors(); //获得全部构造方法
  3. String modifier = Modifier.toString(cons[i].getModifiers()); //获得访问权限
  4. String name = cons[i].getName(); //获得构造方法名称
  5. Class<?> params[] = cons[i].getParameterTypes(); //获得参数类型对象


五、获得Method

 


  
  1. Method ms[] = c.getMethods(); //返回公共的全部方法,包括继承方法
  2. Method dms[] = c.getDeclaredMethods(); //返回本类全部方法,不包括继承的方法
  3. Class<?> rt = ms[i].getReturnType();
  4. Class<?>params[] = ms[i].getParameterTypes();
  5. String name = ms[i].getName();
  6. String modifier = Modifier.toString(ms[i].getModifiers());
  7. Class<?>ex[] = ms[i].getExceptionTypes(); //获得异常
  8. String name = ex[i].getName(); //获得异常名称


六、获得Field


  
  1. Field fs[] = c.getFields(); //获得公共属性,包括继承属性
  2. Field dfs[] = c.getDeclaredFields(); // 获得本类全部属性
  3. Class<?> type = fs[i].getType(); //获得属性的类型对象
  4. String name = fs[i].getName(); //获得属性的名称
  5. String modifier = Modifier.toString(fs[i].getModifiers());

 

 

七、通过反射创建一个对象


  
  1. (1)
  2. Class<?> c = Class.forName("Person");
  3. Person p = (Person)c.newInstance();
  4. (2)
  5. Constructor con = c1.getConstructor(Class....param);
  6. Object obj = con.newInstance(Object obj); //根据构造函数创建一个实例
  7. 八、Constructor创建对象
  8. Class c = Class.forName("Person");
  9. Constructor<?> cons[] = c.getConstructors();
  10. Person p = (Person)cons[0].newInstance("xiazdong",15);
  11. 注:如果调用的构造函数为私有,则需要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为返回的数组对象;

 


  
  1. import java.lang.reflect.*;
  2. public class GetMethodDemo01{
  3. public static void main(String args[])throws Exception{
  4. Class<?> c1 = Class.forName("Person");
  5. Method m = c1.getMethod("sayHello");
  6. m.invoke(c1.newInstance());
  7. Method m2 = c1.getMethod("sayHello2",String.class,int.class);
  8. String str = (String)m2.invoke(c1.newInstance(),"xiazdong",123);
  9. System.out.println(str);
  10. Field nameField = c1.getDeclaredField("name");
  11. Field ageField = c1.getDeclaredField("age");
  12. nameField.setAccessible(true);
  13. ageField.setAccessible(true);
  14. Person obj = (Person)c1.newInstance();
  15. obj.setName("xzdong");
  16. obj.setAge(12);
  17. System.out.println(nameField.get(obj));
  18. System.out.println(ageField.get(obj));
  19. Method setName = c1.getMethod("setName",String.class);
  20. setName.invoke(obj,"changed");
  21. Method getName = c1.getMethod("getName");
  22. System.out.println(getName.invoke(obj));
  23. int tmp[] = {1,2,3};
  24. Class<?> c3 = tmp.getClass().getComponentType();
  25. System.out.println(c3.getName());
  26. System.out.println("第一个数:"+Array.get(tmp,0));
  27. Array.set(tmp,0,5);
  28. System.out.println("第一个数:"+Array.get(tmp,0));
  29. Object arr = Array.newInstance(c3,5);
  30. System.arraycopy(tmp,0,arr,0,Array.getLength(tmp));
  31. System.out.println(Array.get(arr,2));
  32. System.out.println(Array.get(arr,3));
  33. }
  34. }

  
  1. import java.lang.reflect.*;
  2. public class GetMethodDemo01{
  3. public static void main(String args[])throws Exception{
  4. Class<?> c1 = Class.forName("Person");
  5. Method m = c1.getMethod("sayHello");
  6. m.invoke(c1.newInstance());
  7. Method m2 = c1.getMethod("sayHello2",String.class,int.class);
  8. String str = (String)m2.invoke(c1.newInstance(),"xiazdong",123);
  9. System.out.println(str);
  10. Field nameField = c1.getDeclaredField("name");
  11. Field ageField = c1.getDeclaredField("age");
  12. nameField.setAccessible(true);
  13. ageField.setAccessible(true);
  14. Person obj = (Person)c1.newInstance();
  15. obj.setName("xzdong");
  16. obj.setAge(12);
  17. System.out.println(nameField.get(obj));
  18. System.out.println(ageField.get(obj));
  19. Method setName = c1.getMethod("setName",String.class);
  20. setName.invoke(obj,"changed");
  21. Method getName = c1.getMethod("getName");
  22. System.out.println(getName.invoke(obj));
  23. int tmp[] = {1,2,3};
  24. Class<?> c3 = tmp.getClass().getComponentType();
  25. System.out.println(c3.getName());
  26. System.out.println("第一个数:"+Array.get(tmp,0));
  27. Array.set(tmp,0,5);
  28. System.out.println("第一个数:"+Array.get(tmp,0));
  29. Object arr = Array.newInstance(c3,5);
  30. System.arraycopy(tmp,0,arr,0,Array.getLength(tmp));
  31. System.out.println(Array.get(arr,2));
  32. System.out.println(Array.get(arr,3));
  33. }
  34. }

  
  1. import java.lang.reflect.*;
  2. interface China{
  3. public static final String NAME = "CHINA";
  4. public int AGE = 60;
  5. public void sayHello();
  6. public String sayHello2(String name,int age);
  7. }
  8. class Person implements China{
  9. private String name;
  10. private int age;
  11. public String getName(){
  12. return name;
  13. }
  14. public void setName(String name){
  15. this.name = name;
  16. }
  17. public int getAge(){
  18. return age;
  19. }
  20. public void setAge(int age){
  21. this.age = age;
  22. }
  23. public void sayHello(){
  24. System.out.println(NAME+" "+AGE);
  25. }
  26. public String sayHello2(String name,int age){
  27. return name+" "+age;
  28. }
  29. }

 


  
  1. import java.lang.reflect.*;
  2. interface China{
  3. public static final String NAME = "CHINA";
  4. public int AGE = 60;
  5. public void sayHello();
  6. public String sayHello2(String name,int age);
  7. }
  8. class Person implements China{
  9. private String name;
  10. private int age;
  11. public String getName(){
  12. return name;
  13. }
  14. public void setName(String name){
  15. this.name = name;
  16. }
  17. public int getAge(){
  18. return age;
  19. }
  20. public void setAge(int age){
  21. this.age = age;
  22. }
  23. public void sayHello(){
  24. System.out.println(NAME+" "+AGE);
  25. }
  26. public String sayHello2(String name,int age){
  27. return name+" "+age;
  28. }
  29. }

 

 

 

 

 

 

 

 

 

 

 

 

 

文章来源: chenyu.blog.csdn.net,作者:chen.yu,版权归原作者所有,如需转载,请联系作者。

原文链接:chenyu.blog.csdn.net/article/details/49863931

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。