代码改变世界

java反射机制

2016-01-11 11:33  指针空间  阅读(489)  评论(0编辑  收藏  举报

JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。

JAVA的反射机制(Reflection),是一个非常突出的动态相关机制,用在Java身上指的是我们可以于运行时加载、探知、使用编译期间完全未知的classes。换句话说,Java程序可以加载一个运行时才得知名称的class,获悉其完整构造(但不包括methods定义),并生成其对象实体、或对其fields设值、或唤起其methods。

先来个例子,讲解一下反射的使用

tvos.tv.TManager.getInstance().getFactoryManager().getTvosVersion()

TManager和mFManager 是包tvos.tv里的类。

getMethod(…………)这个方法的第一个参数是需要获取的方法的方法名,后面的参数是获取的方法的参数,getMethod的参数个数是跟所要获取的方法相关的

mTManager.getMethod("getInstance", Context.class);获取方法getIntance,第二个参数是方法getIntance的参数,即mTManager对象本身(在类中方法的使用是getIntance(this))

mTManager.getMethod("getFactoryManager");获取方法getFactoryManager,没有第二个参数(方法的定义是getFactoryManager(void),参数是void)

invoke(…………)这个方法跟getMethod类似,第一个参数是对象名,后面的参数跟需要调用的方法相关

Object obj_TManager = getInstance.invoke(mTManager,mContext);通过mTManager调用方法getInstance得到对象obj_TManager,就跟正常调用反过来一样(正常的调用mTMnanager.getInstance(this))

Object obj_FManager = getFactoryManager.invoke(obj_TManager);通过obj_TManager调用getFactoryManager得到对象obj_FManager (正常的调用是mTMnanager.getInstance(this).getFactoryManager())

String sver = getTvsdkVersion.invoke(obj_FManager).toString();通过obj_FManager调用getTvsdkVersion(getTvsdkVersion方法没有参数)得到对象。

其实反射调用就几步:

1、通过Class.forName来获取到类,参数就是类的完整名字

2、通过getMethod来获取到类里的方法名

3、通过invoke来调用方法名

public int getTvosVersion() {
int ver = 0;
try {
Log.d(TAG, "search new interface");
Class<?> mTManager = Class.forName("tvos.tv.TManager");
Log.d(TAG, "mTManager "+mTManager);
Class<?> mFManager = Class.forName("tvos.tv.TFactoryManager");
Log.d(TAG, "mTManager "+mFManager);
Method getInstance =mTManager.getMethod("getInstance", Context.class);
Log.d(TAG, "getInstance "+getInstance);
Method getFactoryManager = mTManager.getMethod("getFactoryManager");
Log.d(TAG, "getFactoryManager "+getFactoryManager);
Method getTvosVersion = mFManager.getMethod("getTvosVersion");
Log.d(TAG, "getTvosVersion "+getTvosVersion);
Object obj_TManager = getInstance.invoke(mTManager,mContext);
Log.d(TAG, "obj_TManager "+obj_TManager);
Object obj_FManager = getFactoryManager.invoke(obj_TManager);
Log.d(TAG, "obj_TManager "+obj_FManager);
String sver = getTvosVersion.invoke(obj_FManager).toString();
Log.d(TAG, "string TvosVersion "+sver);
ver = (Integer) getTvosVersion.invoke(obj_FManager);
Log.d(TAG, "getTvosVersion "+getTvosVersion);
}
catch (NoSuchMethodException e1) {
// TODO Auto-generated catch block
Log.i(TAG, "e1");
e1.printStackTrace();
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
Log.i(TAG, "e2");
e.printStackTrace();
} catch (IllegalArgumentException e) {
// TODO Auto-generated catch block
Log.i(TAG, "e3");
e.printStackTrace();
} catch (IllegalAccessException e) {
// TODO Auto-generated catch block
Log.i(TAG, "e4");
e.printStackTrace();
} catch (InvocationTargetException e) {
// TODO Auto-generated catch block
Log.i(TAG, "e5");
e.printStackTrace();
}
Log.i(TAG, "return TvosVersion "+ver);
return ver;
}