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