Java 异常与反射 总结
1.异常
异常,简单来说,就是一个程序执行过程中发生的不正常情况的事件。它发生在程序的运行期间,干扰了正常的指令流程。如果没有处理异常,那么出现异常之后,程序会停止运行。异常分为运行异常和非运行异常。非运行异常也叫编译异常。对于编译异常编译器要求必须处理。否则无法运行。运行时异常编译器不要求强制处理。运行时异常一般是由程序逻辑错误引起的,程序应该从逻辑角度尽可能避免这类异常的发生。它们都继承于Exception类。运行异常和非运行异常也下分各类异常。异常发生的原因是程序错误或偶然的外在因素导致的一般性问题。
继承关系如图
如果一个方法内抛出异常,该异常会被抛到调用方法中。如果异常没有在调用方法中处理,它继续被抛给这个方法的调用者。这个过程将一直继续下去,直到异常被处理。这一过程称为捕获异常。
2.反射
在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;
对于任意一个对象,都能够调用它的任意一个方法和属性;
这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。
反射的思维导图如下
当使用反射时候,首先需要获取到Class类的对象,得到了这个类之后,就可以得到class文件里面的所有内容。
以下是具体的反射应用方式
1.类型转换:将Map转成Person的示范
Person类是一个普通的实体类,里面包含三个私有的成员属性及它们的Set和Get函数。Map是集合框架里使用的Map类型框架,里面可以加入泛型。具体转换代码如下
//param1:要转化的数据类型Person.class String.class
public static Object toBean(Class<?> type,Map<String,? extends Object> map) throws Exception{ //Introspector专门处理Bean的工具类。比如获取Class的属性或者方法或构造
BeanInfo beanInfo = Introspector.getBeanInfo(type);//参数传递的就是类的类型
//调用newInstance方法创建这个类
Object o = type.newInstance();
//获取o的方法
PropertyDescriptor[] ps = beanInfo.getPropertyDescriptors();
for (int i = 0; i < ps.length; i++) { PropertyDescriptor p = ps[i];
//获取方法描述的名称(属性名称)如果是Person --->name(name,age,sex)
String name = p.getName();
//name是否就是map中的key?
if(map.containsKey(name)){
//通过key获取map的值
Object value = map.get(name);
//通过反射,value赋给o
//p.getWriteMethod();//set方法
//p.getReadMethod();//get方法
p.getWriteMethod().invoke(o, value);
}
}
//获取map中的key的值,以及value的值
return o;
}
public static void main(String[] args) throws Exception {
Map pMap = new HashMap();
pMap.put("name", "张三");
pMap.put("age", 1);
pMap.put("sex", 2);
//Map--->Object
Person p = new Person("张三");
p.setAge(1);
p.setSex(2);
Person o = (Person)toBean(Person.class,pMap);
System.out.println(" "+o.toString());
}
以上代码的思想就是,创建一个相对于想要的类的BeanInfo,然后通过这个BeanInfo对象得到所有的属性名称(对应到Map里就是所有键值对的键),然后判断Map里是否有与获取的键名称同名的键,如果有的话就通过Map获取那个键的值,然后通过PropertyDescriptor对象获取需要的对象的set方法,将值赋值给相应的属性,最后返回相应的类型的对象。
2.Java中五种创建新对象的方法
1>直接用new调用该类的构造函数
new Person("张三");
2>使用class类中的newInstance方法创建对象,调用构造函数
public static void test1() throws ClassNotFoundException, InstantiationException, IllegalAccessException{
//1、获取Class类的对象
Class c = Class.forName("com.Person");
//2、通过Class类中的newInstance方法创建Person对象
Person p = (Person)c.newInstance();
//3、检测一下
p.setName("张三");
System.out.println(p.getName());
}
3>使用class类型中的构造函数中的newInstance方法
public static void test2() throws NoSuchMethodException, SecurityException, InstantiationException, IllegalAccessException, IllegalArgumentException, InvocationTargetException{
//1、获取Person类型
Constructor c = Person.class.getConstructor();
//2、创建方法
Person p = (Person)c.newInstance();
//3、检测
p.setName("张三");
System.out.println(p.getName());
}
4>通过clone方法创建。前提是需要在实体类里重写clone()方法
/**
*实体类
**/
public class Person implements Cloneable{
private String name;
private int age;
private int sex;
@Override
protected Person clone() throws CloneNotSupportedException {
Person person = null;
person = (Person)super.clone();
return person;
}
}
/**
*功能类中clone功能函数
**/
public static void test3(){
//需要重写clone方法,重写cloneable接口。非常特殊
//在Person类里实现cloneable接口
Person p1 =new Person("王五");
//调用clone方法创建一个新的对象p2
Person p2 = null;
try {
p2 = p1.clone();
} catch (CloneNotSupportedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println(p1==p2); }
5>序列化和反序列化的方法,通过这种方法可以将对象转换为字节序列的方式,把对象传输到另一台机器上。
3.通过反射获取方法和操作属性
1>通过反射获取方法
通过反射获取方法的方式是先申明一个Class对象,然后通过该对象的getDeclaredMethod方法创建Method对象,通过Method对象的invoke方法调用获取到的方法实现功能。具体示例代码如下
public static void test5() {
try {
Class c = Class.forName("com.hpe.ref.Person");
//获取方法 Person setName getName
//param1:方法名的String类型
//param2:方法的参数类型
Method m = c.getDeclaredMethod("setName", String.class);
//创建Object对象
Object obj = c.newInstance();
//invoke调用方法(反射的方式调用方法)
//param1:反射的类,param2:m方法的值
m.invoke(obj, "张三");
//验证
Method gM =c.getDeclaredMethod("getName");
System.out.println(gM.invoke(obj));
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
2>通过反射获取属性
通过反射获取属性的方法是通过Class获取该对象的Class对象形式,之后通过Field以字符串的形式获取类中的属性,然后通过Field对象来操作该属性。具体代码如下。
public static void test4(){
//通过反射,在运行阶段创建这个person对象
try {
Class c = Class.forName("com.hpe.ref.Person"); Field field = c.getDeclaredField("name");
//通过字符串的形式获取类中的属性。
Field[] fs = c.getDeclaredFields();
//设置对属性,如果是私有的,可以有权限访问
field.setAccessible(true);
Object o =c.newInstance();
//set方法----操作属性的方式
field.set(o, "张三");
System.out.println(field.get(o));
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (NoSuchFieldException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (SecurityException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (InstantiationException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalAccessException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
3.小注:分析下列代码功能
这段代码的功能分析
public int indexOf(int ch)
返回指定字符第一次出现的字符串内的索引。 如果与值的字符ch在此表示的字符序列发生String第一事件发生之对象,则索引(在Unicode代码单元)被返回。
public StringBuffer insert(int offset, char c)
在此序列中插入char参数的字符串表示形式。
总体效果就好像第二个参数通过方法String.valueOf(char)转换为一个字符串,并且该字符串中的字符然后是inserted到指定的偏移量的这个字符序列。
offset参数必须大于或等于0 ,小于或等于该序列的length 。
所以它的功能是,以小数点为界,每往前数三位,就在str字符串里插入一个逗号。以达到计算数字的位数效果。
Java 异常与反射 总结的更多相关文章
- Java中的反射和注解
前言 在Java中,反射机制和注解机制一直是一个很重要的概念,那么他们其中的原理是怎么样呢,我们不仅仅需要会使用,更要知其然而之所以然. 目录 反射机制 反射如何使用 注解定义 注解机制原理 注解如何 ...
- luogg_java学习_10_异常_反射
本文为博主辛苦总结,希望自己以后返回来看的时候理解更深刻,也希望可以起到帮助初学者的作用. 转载请注明 出自 : luogg的博客园 谢谢配合! 异常_反射 异常 异常就是导致程序中断执行的一段指令流 ...
- Java里面,反射父类里面数字类型字段,怎么set值
Java里面,反射父类里面数字类型字段,怎么set值,我的做法是这样: /** * TODO 直接设置对象属性值, 忽略private/protected 修饰符, 也不经过setter * @aut ...
- Java 异常讲解(转)
六种异常处理的陋习 你觉得自己是一个Java专家吗?是否肯定自己已经全面掌握了Java的异常处理机制?在下面这段代码中,你能够迅速找出异常处理的六个问题吗? 1 OutputStreamWrite ...
- 一篇不错的讲解Java异常的文章(转载)
http://www.blogjava.net/freeman1984/archive/2007/09/27/148850.html 六种异常处理的陋习 你觉得自己是一个Java专家吗?是否肯定自己已 ...
- 浅说Java中的反射机制(二)
写过一篇Java中的反射机制,不算是写,应该是抄了,因为那是别人写的,这一篇也是别人写的,摘抄如下: 引自于Java基础--反射机制的知识点梳理,作者醉眼识朦胧.(()为我手记) 什么是反射? 正常编 ...
- 4 Java学习之 反射Reflection
1. 反射概念 反射机制就是:动态地获取类的一切信息,并利用这些信息做一些你想做的事情. java反射机制能够知道类名而不实例化对象的状态下,获得对象的属性或调用方法. JAVA反射机制是在运行状态 ...
- 10 个深恶痛绝的 Java 异常。。
异常是 Java 程序中经常遇到的问题,我想每一个 Java 程序员都讨厌异常,一 个异常就是一个 BUG,就要花很多时间来定位异常问题. 什么是异常及异常的分类请看这篇文章:一张图搞清楚 Java ...
- java基础(十一 )-----反射——Java高级开发必须懂的
本文我们通过一个实际的例子来演示反射在编程中的应用,可能之前大家对反射的学习,仅仅是停留在概念层面,不知道反射究竟应用在哪,所以是一头雾水.相信通过这篇教程,会让你对反射有一个更深层次的认知. 概念 ...
随机推荐
- c语言:第二次作业,循环结构
1.本章学习总结(2分) 1.1 思维导图 1.2 本章学习体会及代码量学习体会 1.2.1 学习体会 循环相比分支和顺序结构难了许多,相对的来说我的c语言的基础比之前有提高,但是还是很多题想了很久也 ...
- 2018-2019-20175302实验二《Java面向对象程序设计》实验报告
2018-2019-2 学号实验二<Java面向对象程序设计>实验报告 一.实验步骤及内容 1. 面向对象程序设计 参考 http://www.cnblogs.com/rocedu/p/6 ...
- 第一次博客作业 <西北师范大学| 周安伟>
1.助教博客链接:https://home.cnblogs.com/u/zaw-315/ 2.本周点评的作业数:3份,有留言互动. 3.本周点评有困难的地方: https://www.cnblogs ...
- 编写程序,使用while循环将50到100的整数相加
#include<iostream> int main(int argc, char const *argv[]) { using std::cout; ,b=; ){ a++; b=+b ...
- ROC AUC
1.什么是性能度量? 我们都知道机器学习要建模,但是对于模型性能的好坏(即模型的泛化能力),我们并不知道是怎样的,很可能这个模型就是一个差的模型,泛化能力弱,对测试集不能很好的预测或分类.那么如何知道 ...
- LoadRunner 11.00安装篇(Win 10)
参考博文: https://blog.csdn.net/xianjie0318/article/details/78625980 https://www.cnblogs.com/VseYoung/p/ ...
- 苹果手机input有圆角阴影的解决方法
input[type=button], input[type=submit], input[type=file], button { cursor: pointer; -webkit-appearan ...
- Spring bean的生命流程
Spring 是一个轻量级的 J2EE 开源框架,其目标是降低企业级应用开发难度,提高企业级应用开发效率.在日程开发中,我们会经常使用 Spring 框架去构建应用.所以作为一个经常使用的框架,了解其 ...
- win10无法访问服务器上的共享文件夹怎么设置,提示:你不能访问此共享文件夹,因为你组织的安全策略阻止未经身份验证的来宾访问
此问题需要修改Win10 网络策略 按window+R键输入gpedit.msc 来启动本地组策略编辑器. 依次找到“计算机配置-管理模板-网络-Lanman工作站”这个节点,在右侧内容区可以看到“启 ...
- 1,charles的功能能介绍和安装破解
1,charles的功能 1,截取http和https网络包 2,支持重发网络请求,方便后端调试 3,支持网络请求的截获和动态修改 4,支持模拟弱化的网络 2,安装和破解 1,进入官网下载地址:htt ...