【Android开发经验】使用反射,得到的类的字段、方法、并实现了简单的调用
本文后推出Android的ICO框架做准备,所以,假设你想要一个最近的一项研究Android的ICO学生框架。你可以稍微看一下。
首先,简介一下Java里面的反射。
JAVA反射机制是在执行状态中,对于随意一个类,都可以知道这个类的全部属性和方法。对于随意一个对象,都可以调用它的随意一个方法和属性。这样的动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。
不知道这种一段解释,你是否能看懂。假设更简单的说。反射就是能够依据你给出类名实例化出一个实实在在的对象。所以,对象的实例化就不是写死的了。我们能够依据传入的类名不同,从而能够实例化出不同的对象。这种方式能够和工厂设计模式非常好的结合,从而能够更加灵活的创建对象。
以下。我们简单的介绍一下怎样使用反射来进行对象的创,以及方法、字段的获取与使用。
首先,给出要用的实体类的代码,重点注意一下字段和方法的权限的修饰符
package edu.qust.demo; /**
*
* @ClassName: Person
* @Description: Person实体类
* @author: ZhaoKaiQiang
* @time: 2014-7-18上午10:41:23
* @version: V1.0
*/
public class Person { private int age;
private String name;
protected int height;
public String school; Person(){
this.name = "Person";
age = 22;
} Person(String name) {
this.name = name;
} private String showName(String _name) {
return "My name is " + _name;
} public void setAge(int age) {
this.age = age;
} public int getAge() {
return age;
} @Override
public String toString() {
return "My name is " + name + ", i'm " + age + " years old";
}
}
以下,我们開始介绍。在Java中,怎样使用代码实现反射。
以下是測试程序
package edu.qust.demo; import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method; public class Main { private static Person person;
private static Class<Person> cls; @SuppressWarnings("unchecked")
public static void main(String[] args) { person = new Person("Zhao");
cls = (Class<Person>) person.getClass(); creatClassByReflection();
printAllMethods();
printAllFileds();
invokePrivateMothod();
} /**
* 利用反射创建对象
*/
private static void creatClassByReflection() {
try {
Person accpTeacher = (Person) Class.forName("edu.qust.demo.Person")
.newInstance();
System.out.println(accpTeacher.toString());
System.out.println();
} catch (InstantiationException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
} /**
* 获取并调用私有方法
*/
private static void invokePrivateMothod() {
try {
// 获取方法名为showName,參数为String类型的方法
Method method = cls.getDeclaredMethod("showName", String.class);
// 若调用私有方法。必须抑制java对权限的检查
method.setAccessible(true);
// 使用invoke调用方法。而且获取方法的返回值。须要传入一个方法所在类的对象,new Object[]
// {"Kai"}是须要传入的參数,与上面的String.class相相应
String string = (String) method.invoke(person,
new Object[] { "Kai" });
System.out.println(string);
} catch (NoSuchMethodException e) {
e.printStackTrace();
} catch (SecurityException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (IllegalArgumentException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
}
} /**
* 获取并打印全部的字段名
*/
private static void printAllFileds() {
Field[] field = cls.getDeclaredFields();
System.out.println("getFields():获取全部权限修饰符修饰的字段");
for (Field f : field) {
System.out.println("Field Name = " + f.getName());
}
System.out.println();
} /**
* 获取并打印全部的方法名
*/
private static void printAllMethods() {
Method[] method = cls.getDeclaredMethods();
System.out.println("getDeclaredMethods():获取全部的权限修饰符修饰的Method");
for (Method m : method) {
System.out.println("Method Name = " + m.getName());
}
System.out.println();
}
}
以下是上面的測试程序的输出结果
My name is Person, i'm 22 years old getDeclaredMethods():获取全部的权限修饰符修饰的Method
Method Name = toString
Method Name = showName
Method Name = setAge
Method Name = getAge getFields():获取全部权限修饰符修饰的字段
Field Name = age
Field Name = name
Field Name = height
Field Name = school My name is Kai
在java.lang.reflect包中,提供了类和接口,来获得关于类和对象的反射信息。
在这里,我们眼下仅仅关注Field和Method这两个类,分别代表类的成员变量和方法。
除此之外。在java.lang.Class。还有个反射须要用到的非常重要的类,Class,这个类中封装了一个类全部的信息,包含各种全县修饰符修饰的成员变量和方法。因此,我们能够用这个类,来获取类的各种信息。Class继承自Object,利用Object.getClass能够获取到某对象执行时类的 Class 对象。
我们的操作,主要就是获取某个类的Class对象。然后利用这个对象,就能够获取到某个类全部的成员变量以及方法,而且能够对随意权限修饰符修饰的方法进行调用,注意。是随意哦,即使是private修饰的类的方法。我们也能够利用反射进行调用,所以说反射能够说是相当逆天啊。
首先看第一个方法的输出
My name is Person, i'm 22 years old
在这里,我们利用一个类的String字符串的名字,实例化出了一个对象。这就是上面所说的。依据传入的字符串的不同,能够创建出不同的对象。
调用newInstance方法,Java会去找默认的构造函数,完毕对象的初始化,因此得到了这种结果。
再看第二个方法的输出
getDeclaredMethods():获取全部的权限修饰符修饰的Method
Method Name = toString
Method Name = showName
Method Name = setAge
Method Name = getAge
我们使用getDeclaredMethods这种方法,获取到了类里面全部的方法,然后我们进行遍历,将类名进行简单的输出。
第三个方法的结果和第二个差点儿相同,仅仅只是就是把Method换成了Filed,然后把字段名进行了输出。
getFields():获取全部权限修饰符修饰的字段
Field Name = age
Field Name = name
Field Name = height
Field Name = school
第四个方法中,我们依据方法名,获取到详细某一个方法,然后传入參数。利用invoke进行方法的调用。
再调用之前,必须设置method.setAccessible(true);从而能够调用使用private修饰的方法。
除了上面代码中,用到的这些方法,Class类还有非常多其它的方法。很多其它详细的使用,还是看文档去吧。
版权声明:本文博客原创文章,博客,未经同意,不得转载。
【Android开发经验】使用反射,得到的类的字段、方法、并实现了简单的调用的更多相关文章
- c# 反射得到实体类的字段名称和值,DataTable转List<T>
/// <summary> /// 反射得到实体类的字段名称和值 /// var dict = GetProperties(model); /// </summary> /// ...
- C# 中利用反射机制拷贝类的字段和属性(拷贝一个类对象的所有东西付给另一个类对象,而不是付给引用地址)
from:https://blog.csdn.net/poxiaohai2011/article/details/27555951 //C# 中利用反射机制拷贝类的字段和属性(拷贝一个类对象的所有东西 ...
- java反射 顺序输出类中的方法
java反射可以获取一个类中的所有方法,但是这些方法的输出顺序,并非代码的编写顺序. 我们可以通过自定义一个注解来实现顺序输出类中的方法. 首先,先写一个类,定义增删改查4个方法 public cla ...
- python 面向对象类成员(字段 方法 属性)
一.字段 字段包括:普通字段和静态字段,他们在定义和使用中有所区别,而最本质的区别是内存中保存的位置不同, 普通字段属于对象 静态字段属于类 class Province: # 静态字段 countr ...
- Unity热更新之C#反射动态获取类属性及方法
如果我们要为发布出去的游戏更新一些功能,但又不想让用户重新下载整个游戏包,只让他下载我们更新的资源包,用assetBundle打包资源的方式是可以的,但其中有个最大的例外,那就是脚本. 虽然asset ...
- java-通过反射获取目标类的属性,方法,构造器
首先定义一个urse package com.studay_fanshe; public class User { private String uname; private int age; pri ...
- Android DataBinding不能自动生成ViewDataBinding类的解决方法
如果Build.gradle和Layout文件配置正确,仍无法生成ViewDataBinding类. 经测试,Gradle的sync无效,clean project无效,invalidate and ...
- 使用C#的反射机制读取类的字段名称及值
using System.Windows.Forms;using System.Reflection; foreach (FieldInfo fi in typeof(SystemInformatio ...
- List中的Contains方法内部其实是用对象的equals方法做比较,所以如果比较两个类就重写类的equals方法即可;而Set是调用equals和hashCode
public class Person { private String name; private int age; public String getName() { return name; } ...
- Python类总结-字段,方法,属性区别及StaticMethod, Property,私有字段和私有属性
类包含下列 静态属性 动态属性 静态方法 动态方法 class Province: #静态字段--属于类,调用方法类.字段名 memo = "中国23个省之一" #动态字段--属于 ...
随机推荐
- mfc 导出数据保存成excel和txt格式
最近做了一些东西,项目到了收尾的工作.不过这次我没有参与到控件机器的功能的那一部分,都是主管自己写的.不过,所有的控件重写都是由我来做的.还有数据库这一方面是我和主管共同完成的.不过还不错,主管写一部 ...
- bunoj 34990(hash)
传送门:Justice String 题意:有两个串A,B,问是否存在A的一个子串S,S和B的长度相等,最多有2个字符不同.如果有多个,输出其实下标最小S的下标,没有输出-1. 分析:从A每个位置开始 ...
- symbol(s) not found for architecture i386
此问题针对百度地图真机调试和模拟器.a文件的选取问题 "$(SRCROOT)/MobileYonyou/Third/BaiduMap_IOSSDK_v2.3.0_Lib/Release$(E ...
- 使用CSVDE批量导入命令/出口AD用户
使用CSVDE批量导入命令/出口AD用户 CSVDE命令行工具可以与真实的用户信息CSV文件.批量导入/出口AD在. 导入的基本的语法命令是这种: csvde -i -f c:\fil ...
- Deep Learning(深度学习) 学习笔记(四)
神经概率语言模型,内容分为三块:问题,模型与准则,实验结果.[此节内容未完待续...] 1,语言模型问题 语言模型问题就是给定一个语言词典包括v个单词,对一个字串做出二元推断,推断其是否符合该语言表达 ...
- Android数据库高手秘籍(一)——SQLite命令
转载请注明出处:http://blog.csdn.net/guolin_blog/article/details/38461239 要想熟练地操作不论什么一个数据库.最最主要的要求就是要懂SQL语言, ...
- SQLServer 复制中移除和加入公布而不初始化全部项目
-- 若提前"禁止架构更改".新增的列不会自己主动加入大公布.此时应使用 sp_articlecolumn 加入列 EXEC sp_changepublication @publi ...
- 组队赛第二场:字符串哈希+DP
长春现场赛 HDU 4821 思路:这题周赛的时候没做出来,有点可惜了.要是当时记起来unsigned long long自己主动取模,然后提醒一下大帝的话,后续大帝就能过了. 唉,导致让他取了好多 ...
- cocos2d-x 3.0游戏实例学习笔记《卡牌塔防》第二步---编辑器(1)--触摸加入点
/* 说明: **1.本次游戏实例是<cocos2d-x游戏开发之旅>上的最后一个游戏,这里用3.0重写并做下笔记 **2.我也问过木头本人啦,他说:随便写,第一别全然照搬代码:第二能够说 ...
- SVN的revert和update命令的区别
svn中的revert和update 今天有人问到revert和update的问题. 刚开始还真被问住了. 因为感觉revert和update都可以将本地的copy更新到以前的一个版本,会有什么不同呢 ...