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

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

 

 

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

(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;  }  
}  

 

 

 

 

 

 

 

 

 

 

 

 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/295052.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

[MySQL]关于amd.dll后门病毒入侵3306端口的临时解决方案

为什么80%的码农都做不了架构师&#xff1f;>>> amd.dll入侵事宜&#xff1a; 由于MySQL 5.1.30以上版本的一个漏洞&#xff08;当然是不是因为漏洞的原因&#xff0c;目前暂未知&#xff09;&#xff0c;导致一个后门程序会通过3306端口的MySQL服务获取到Windows…

微软将终止免费的条码标签服务

本文转自&#xff1a;慧都控件网 http://***/zh-CN/info/catalog/19420.html 在纽约时间2013年8月19号&#xff0c;Scanbuy——这个手机软件巨头&#xff0c;手机移动设备的条形码解决方案提供商&#xff0c;被微软选中成为微软条码标签的授权使用者。在购买了微软条码标签技术…

Spring Security3源码分析-http标签解析(转)

为什么80%的码农都做不了架构师&#xff1f;>>> 在FilterChainProxy初始化的过程中&#xff0c;大概描述了标签解析的一些步骤&#xff0c;但不够详细 <http auto-config"true"> <remember-me key"workweb" token-validity-se…

Android之React Native 中组件的生命周期

React Native 中组件的生命周期 概述 就像 Android 开发中的 View 一样&#xff0c;React Native&#xff08;RN&#xff09; 中的组件也有生命周期&#xff08;Lifecycle&#xff09;。所谓生命周期&#xff0c;就是一个对象从开始生成到最后消亡所经历的状态&#xff0c;理解…

当女朋友学会「监视」男朋友......

1 日本网友拍到两只水母互殴&#xff01;▼2 打印机也会生气&#xff1f;&#xff08;素材来源网络&#xff0c;侵删&#xff09;▼3 现在你们可以互换卡槽了~&#xff08;素材来源网络&#xff0c;侵删&#xff09;▼4 有什么适合整蛊朋友的恶作剧▼5 哈哈哈哈哈&#xff…

使用.NET5、Blazor和Electron.NET构建跨平台桌面应用

Electron.NET是一个嵌入了ASP.NET Core的Electron的封装&#xff0c;通过Electron.NET可以构建基于.NET5的跨平台的桌面应用&#xff0c;使得开发人员只需要使用ASP.NET Core和 Blazor就可以胜任桌面应用的开发工作。开发环境操作系统Windows/macOS/Linux.NET5.0npm创建新项目创…

蜗蜗 Linux内核芬妮下,201402 - 蜗窝科技

作者&#xff1a;wowo 发布于&#xff1a;2014-2-27 17:01分类&#xff1a;统一设备模型在“Linux内核的整体架构”中&#xff0c;蜗蜗有提到&#xff0c;由于Linux支持世界上几乎所有的、不同功能的硬件设备(这是Linux的优点)&#xff0c;导致Linux内核中有一半的代码是设备驱…

linux内核分析作业3:跟踪分析Linux内核的启动过程

内核源码目录 1、 arch:录下x86重点关注 2、 init&#xff1a;目录下main.c中的start_kernel是启动内核的起点 3、 ipc&#xff1a;进程间通信的目录 实验 使用实验楼的虚拟机打开shell cd LinuxKernel/ qemu -kernel linux-3.18.6/arch/x86/boot/bzImage -initrd rootfs.img 使…

图表中各个参数的应用( AChartEngine XMultipleSeriesRenderer

图表中各个参数的应用&#xff08; AChartEngine XMultipleSeriesRenderer 运行demo可以发现&#xff0c;它的所有chart都是可以移动&#xff0c;背景色为黑。。。。不过我们有时候会希望chart不动或者改变背景色等一些样式。 这节就介绍一些demo中没有使用的但有很常见的一些关…

用正则匹配多行文本

如果有这样一个字符串 $var "src arr.c build.c eval.c field.c \ missing.c msg.c re.c version.c" 用一般的^\w\s*\s*.*$只能匹配上面的那句&#xff0c;而下面的那一句就无法匹配了 方法一&#xff1a;使用的是perl $var "src arr.c build.c eval.c fiel…

Android之用HttpURLConnection参数以XML形式封装的部分关键代码

HttpURLConnection参数以XML形式封装 //得到连接public static HttpURLConnection setRequest(String urlStr) {HttpURLConnection con = null;try {URL url = new URL(urlStr);try {con = (HttpURLConnection) url.openConnection();con.setDoOutput(true);con.setDoInput(tru…

linux安装定制添加输入,Arch Linux--定制自己的Linux操作系統(乙-國際化桌面安裝篇)...

Arch Linux&#xff0d;&#xff0d;定制自己的Linux操作系統&#xff0d;&#xff0d;&#xff0d;&#xff0d;乙&#xff0d;國際化&桌面安裝篇相信大家看了《甲-安裝篇》之後&#xff0c;Arch Linux系統已經可以正常運行了吧&#xff1f;不過&#xff0c;Arch Linux默認…

ToLookup 和 GroupBy 到底有什么不同?

咨询区 Shlomo&#xff1a;.ToLookup<TSource, TKey> 返回的是 ILookup<TKey, TSource>, 但我发现 ILookup<TKey, TSource> 同时也实现了 IEnumerable<IGrouping<TKey, TSource>> 接口。.GroupBy<TSource, TKey> 直接返回的是 IEnumerabl…

这几部经典纪录片,竟然还有人没看过?

全世界只有3.14 % 的人关注了爆炸吧知识看纪录片&#xff0c;既可以追溯上下数千年的历史文化&#xff0c;也可以欣赏从宇宙到地心深处的奇妙境界&#xff0c;而及其超级精彩的画面即使定格&#xff0c;也是一幅摄影佳作。纪录片题材广泛、制作精良&#xff0c;观看起来算的上是…

Android之获取屏幕和视图高和宽

在android中&#xff0c;画布Canvas的高宽其实是屏幕的高宽。 1. WindowManager windowManager getWindowManager(); Display display windowManager.getDefaultDisplay(); screenWidth display.getWidth(); screenHeight display.getHeight(); 2DisplayMetrics d…

Html5 Video 节点

1、支持的视频格式 当前&#xff0c;video 元素支持三种视频格式&#xff1a;格式 IE Firefox Opera Chrome Safari Ogg No 3.5 10.5 5.0 No MPEG4 9.0 No No 5.0 3.0 WebM No 4.0 10.6 6.0 NoO…

github 上微信判断是否被删除的源码 以及使用解惑

为什么80%的码农都做不了架构师&#xff1f;>>> 从Github上的https://github.com/0x5e/wechat-deleted-friends&#xff0d;&#xff0d;clone出来的代码 今天在我的机器上不能运行了&#xff0c;环境为Mac 10.10 python2.7.10中 提示错误&#xff0c; Traceback (…

【转】android makefile文件分析

Makefile的规则如下&#xff1a; target ... : prerequisites ... command ... ... target可以是一个目标文件&#xff0c;也可以是Object File&#xff08;例如helloworld.obj&#xff09;&#xff0c;也可以是执行文件和标签。 prerequisites就是生成target所需要的文件或是目…

坑爹!千万不要在生产环境使用控制台日志

前言某控制台应用程序会随机卡死&#xff0c;一直找不到原因。无意中在控制台敲了下回车&#xff0c;发现程序居然恢复正常了。最后在stackoverflow上找到了这个帖子&#xff1a;How and why does QuickEdit mode in Command Prompt freeze applications?[1]原来是“快速编辑模…

这五部关于海洋的纪录片,每一帧都犹如壁纸!

全世界只有3.14 % 的人关注了爆炸吧知识虽说读万卷书不如行万里路&#xff0c;但现在足不出户也能让你见识到世界各地的奇特风景。今天小编要推荐几部关于海洋的纪录片&#xff0c;这些纪录片从不同方面揭示了深海下面的奥秘&#xff0c;带你领略不一样的神秘景色。&#xff08…