应用场景:
在开发游戏sdk时,如果多个渠道sdk在一个融合框架中相互调用,为了更好做到要打哪个渠道的sdk就调用此sdk的方法的兼容性,在不导入此sdk时,又可以使程序跑起来,不崩溃,这样就用到了java反射在框架进行调用,达到了更好的效果。
以下分别以三种函数方法进行java反射举例解析说明
1、先声明三种函数方法的类
package utils;
public class TestReflect {
public String getName(){
return "反射返回String方法";
}
public void setName(int a){
System.out.print(a);
}
public String setMoreParams(int a,String key){
return a+key;
}
}
2、没带参数的返回值方法进行反射解析
public static String getReturnValue(){
// 通过Class.froName,传递package及className获取Class
Class c = null;
String channelName;
try {
c = Class.forName("utils.TestReflect");
// 获取Class
Constructor con = c.getConstructor();
Object obj = con.newInstance();
//调用Class类的方法getMethod获取指定的方法testInvoke
Method method = c.getMethod("getName");
//调用Method类的方法invoke运行testInvoke方法
String str=(String)method.invoke(obj);
channelName=str;
} catch (Exception e) {
channelName="";
}
return channelName;
}
3、带一个参数方法的反射解析
public static void print(Object j){
// 通过Class.froName,传递package及className获取Class
Class c = null;
try {
c = Class.forName("utils.TestReflect");
Object obj = c.newInstance();
//调用Class类的方法getMethod获取指定的方法testInvoke
Method method = c.getMethod("setName",int.class);
//调用Method类的方法invoke运行testInvoke方法
method.invoke(obj,j);
} catch (Exception e) {
e.printStackTrace();
}
}
4、多参数方法的反射解析
public static void getMoreParams(Object j,Object k){
// 通过Class.froName,传递package及className获取Class
Class c = null;
try {
c = Class.forName("utils.TestReflect");
Object obj = c.newInstance();
//调用Class类的方法getMethod获取指定的方法testInvoke
Method method = c.getMethod("setMoreParams", int.class, String.class);
//调用Method类的方法invoke运行testInvoke方法
String str=(String)method.invoke(obj,j,k);
System.out.print(str);
} catch (Exception e) {
e.printStackTrace();
}
}
反射步骤总结
1、确定要反射的类,通过Class.forName()此方法找到此类;
2、实例化此类,通过 c.newInstance()进行实例化;
3、调用此类的所需方法,通过c.getMethod(方法名,参数类型。。。)获取此反射方法;
4、执行方法,通过method.invoke(反射类实例对象,参数对象。。。)执行并调用此类的方法;