JAVA反射机制是在
运行状态中,对于任意一个
类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。
JAVA反射(放射)机制:“
程序运行时,允许改变程序结构或
变量类型,这种语言称为
动态语言”。从这个观点看,Perl,Python,Ruby是
动态语言,C++,Java,C#不是动态语言。但是JAVA有着一个非常突出的动态相关机制:Reflection,用在Java身上指的是我们可以于运行时加载、探知、使用编译期间完全未知的classes。换句话说,Java程序可以加载一个运行时才得知名称的class,获悉其完整构造(但不包括methods定义),并生成其对象实体、或对其fields设值、或唤起其methods。
反射示例:
String methodName = null;
try {
methodName = xmlUtil.getMethodName(xml);
} catch (Exception e) {
return xmlUtil.toFaildXml("解析xml出错", "unknown");
}
Method method = null;
try {
method = MainService.class.getDeclaredMethod(methodName, new Class[] { String.class });
} catch (SecurityException e) { //在调用方无权需要访问资源时,引发 SecurityException 异常
return xmlUtil.toFaildXml("程序异常", methodName);
} catch (NoSuchMethodException e) {
return xmlUtil.toFaildXml("找不到指定方法", methodName);
}
try {
Object returnXml = method.invoke(this, new Object[] { xml });
return returnXml.toString();
} catch (IllegalArgumentException e) {
return xmlUtil.toFaildXml("向方法传递了一个不合法或不正确的参数", methodName);
} catch (IllegalAccessException e) { //安全权限异常,一般来说,是由于java在反射时调用了private方法所导致的。
//如果是这种情况的话,要把反射pirvate的方向设置成public,再调用
return xmlUtil.toFaildXml("无法访问此方法", methodName);
} catch (InvocationTargetException e) { //捕捉到这个异常后要调用 .getCause() 方法才能获取真实的异常信息
if (e.getCause() instanceof ParseXmlException) {
return xmlUtil.toFaildXml("解析xml出错", methodName);
}
e.getCause().printStackTrace();
return xmlUtil.toFaildXml("程序执行出现异常:" + e.getCause().getMessage(), methodName);
}