(十一)泛型、反射和异常

JavaSE(十一)

--泛型、反射和异常

一、泛型

泛型是javaSE1.5的新特性,泛型的本质是参数化类型,也就是说所操作的数据类型被指定为一个参数,这种参数类型可以用在类、接口和方法的创建中,分别称为泛型类、泛型接口、泛型方法。

在javaSE1.5之前,没有泛型的情况下,通过对类型Object的引用来实现参数的”任意化”,”任意化”带来的缺点是要做显示的强制类型转换,而用这种转换的要求是要求开发者对实际参数可以预知的情况下进行的。对于强制类型转换错误的情况,编译器可能不提示错误,在运行的时候才出现异常,这是一个安全隐患。

泛型的好处是在编译的时候检查类型安全,并且所有的强制转换都是自动的和隐式的,提高代码的重用率。

这段话的意思是,javaSE1.5之前,假设我们在集合中存入了一个Object对象,这个Object对象我们知道是什么类型的,但是编译器不知道,所以取出来的时候还得强转,而且我们只有在知道这个对象类型的时候才能强转,否则看起来没错,运行时候还会抛异常呢。

二、反射

一个对象可以通过object.getClass()获得它运行时的类.

可以getName获得类名..

可以再getDeclaredMethods()获取这个类的所有能访问到的方法,获取到方法之后可以遍历,通过getName获取方法名,getModifiers()获取方法修饰符...

也可以getGenericInterfaces获取该类所有的接口。

可以getFields获取所有的能访问到的成员变量,再遍历中getName获取变量名,getModifiers()获取变量修饰符...

更多方法参考java.lang.reflect的帮助文档

三、异常

1.简介: 当程序出现无法控制的外部环境问题(用户提供的文件不存在,文件内容损坏)时,java就会用异常对象来描述.

2.分类:

①检查性异常(java.lang.Exception)

程序正确,但因为外在的环境条件不满足,所以引发检查性异常。Java编译器强制要求处理这类异常,如果不捕获这类异常,程序将不能被编译。

例如FileReader fileReader=new FileReader(new File("D:\666.txt"));,马上系统会提示你有一个异常未处理,因为你找文件,它可能找不到啊,如果找不到怎么办?这是一个异常,所以需要你马上处理。

②运行时异常(java.lang.RuntimeException)

这意味着程序存在bug,例如数组越界、0被除、入参不满足规范...这类异常需要更改程序来避免,java编译器强制要求处理这类异常。

③错误(java.lang.Error)。

一般很少见,也很难通过程序解决,它可能源于程序的bug,但一般更可能源于环境问题,如内存耗尽,错误在程序中无需处理,而由运行环境处理。

顶层是java.lang.Throwable类,检查性异常、运行时异常、错误都是这个类的子孙类(Exception和Error继承自Throwable,而RuntimeException继承自Exception)。

3.处理方式: java用两种方法来处理异常,①在发生异常的地方直接处理②将异常抛给调用者,让调用者处理.

try {

可能发生异常的操作A;

} catch (异常种类1 e) {

该异常处理。//一般e.printStackTrace();

}catch (异常种类2 e) {

该异常处理。//一般e.printStackTrace();

}

一般还会在最后加一个finally,如果把finally块至于try...catch...语句后,finally块一般都会得到执行(不管发没发生异常),它相当于一个万能的保险,即使前面的try块发生异常,而又没有对应异常的catch块,finally块将马上执行,一般我们在finally中实现对资源、流的关闭。

以下情况,finally块将不会被执行:

①finally块中发生了异常;

②程序所在线程死亡;

③前面的代码中使用了System.exit();

④关闭cpu;

Throw Exception,函数A 抛出一个异常,表面我这个函数不想管这个异常,到时候谁调用函数A谁再管这个异常。

4.异常的作用

当程序执行到某一块有错的时候,发生了异常,我们并不想让程序就此停住,因为有可能这个异常根本不影响后面代码的执行,所以我们处理异常并让程序继续执行。

时间: 2024-08-28 10:27:02

(十一)泛型、反射和异常的相关文章

泛型反射

一. 泛型回顾 1. 泛型参数可以有多个. 2. 开放类型(泛型类)和封闭类型(泛型类的实例). 3. 泛型类的继承 4. 泛型约束(where T : new() – 目前.NET只支持无参构造函数的约束) (1)构造函数约束: (2)基类约束: (3)struct/class约束: (4)构造器约束: 5. 泛型方法的类型参数,可以用在该方法的形参,方法体,返回值三处. 6. 泛型方法的重载,类型参数和方法参数列表都是构成重载的元素. 7. 泛型方法的重写 程序示例: 1 public cl

Python第二十一课(反射/元类)

Python第二十一课(反射/元类)    >>>思维导图>>>中二青年 反射reflect 什么是反射, 其实是反省,自省的意思 反射指的是一个对象应该具备,可以检测,修改,增加自身属性的能力 反射就是通过字符串操作属性 涉及的四个函数,这四个函数就是普通的内置函数 没有双下划綫,与print等等没有区别 hasattr getattr setattr delattr p = Person("jack",18,"man") #

泛型反射常见应用,通过类型创建实例,通过反射实现增删改查

public class Test { public void MyObj<T>() where T : class { //T t = new T(); T t =System.Activator.CreateInstance<T>(); //获取类型跟字段然后拿到对应名字方法跟字段就可以了 } } 微信官方创建实体的方法,通过泛型类型创建实例System.Activator.CreateInstance<T>(); 新增: public static void Ad

Java泛型反射机制(二)

/** * @author Administrator * 好处:泛型:1安全 2减少代码重用率 */ package com.test; import java.lang.reflect.Method; public class Test2 { public static void main(String[] args) { // TODO Auto-generated method stub // Gen<String> gen1 = new Gen<String>("

Java泛型反射机制(一)

/** * * @author Administrator * 功能:泛型的必要性(参数化类型)(安全简单) */ package com.test; import java.util.*; public class Test { /** * @param args */ public static void main(String[] args) { // TODO Auto-generated method stub // ArrayList al = new ArrayList(); //

python 3.x 学习笔记12 (反射 and 异常)

1.反射通过字符串映射或修改程序运行时的状态.属性.方法 getattr(obj,name_str):  根据字符串name_str去获取obj对象里的对应的方法的内存地址 hasttr(obj,name_str):    判断一个对象obj里是否有对应的字符串的方法 setattr(obj,'y',z):              setattr 函数对应函数 getatt(),用于设置属性值,该属性必须存在. delattr(obj,'y'):                 从给定的对象中

java 反射和泛型-反射来获取泛型信息

通过指定对应的Class对象,程序可以获得该类里面所有的Field,不管该Field使用private 方法public.获得Field对象后都可以使用getType()来获取其类型. Class<?> type = f.getType();//获得字段的类型 但此方法只对普通Field有效,若该Field有泛型修饰,则不能准确得到该Field的泛型参数,如Map<String,Integer>; 为了获得指定Field的泛型类型,我们采用: Type gType = f.getG

Java编程思想学习(十一) 泛型

1.概要 generics enable types (classes and interfaces) to be parameters when defining classes, interfaces and methods. 泛型能在定义类,接口和方法时将类型(类和接口)作为参数.和方法声明时的形式参数很类似,都是为了在不同的输入时重用相同的代码.不同的是形式参数输入的是值而泛型是类型. 2.为什么使用泛型 1.编译时更加强的(Stronger)类型检测java编译器对泛型代码进行强类型检

Java的泛型反射

If the superclass is a parameterized type, the {@code Type} * object returned must accurately reflect the actual type * parameters used in the source code. T 上文档DOC,如果父类是一个参数化类型,那么Type返回的是参数类型的真实类型 package entity; import java.lang.reflect.Parameteriz