第十六章 反射
1,Class类与Java反射
- Dome dome=new Dome();
Class domec=dome.getClass();
这个方法可以用来返回dome的类,Class类的对象domec,可以用来返回该对象的dome对象的描述信息
1,访问
setAccessible()方法可以获取对私有成员的使用权限
- 可以利用以下方法访问构造方法,会返回Constructor类型的对象挥着数组,每个对象代表一个构造方法,利用Constructor对象可以操纵相应的构造方法。
getConstructors();返回公共得到构造方法
getConstructor(参数,参数……);返回指定的公用方法
geDeclaredConstructors();返回所有的
geDeclaredConstructor(参数,参数……);返回指定
注意是访问所有还是仅仅公共,把我坑惨了
java.lang.reflext.Modifier类可以解析出getModifier();方法返回的修饰符信息,p。290页。 - 下面的几个方法可以返回Field类型的对象和数组。利用它可以操作相应的成员变量。
getFileds();
getField(String name);
getDeclaredFields();
getDeclaredFields(String name);
如果访问的是指定的成员变量,可以利用他的名字进行访问, - 访问方法
访问方法时候会返回Method类型的数组或者对象,每个对象仅仅代表一个方法,利用它可任意操作相应的方法
getMethods();
getMethod(方法名,入口参数);
getDeclaredMethods();
getDeclaredMethods(方法名,入口参数);
要是访问指定方法可以根据你这个方法的名字和入口参顺进行,有两个例子
objectClass.getDeclaredMethods(“print”,String.class,int.class);
objectClass.getDeclaredMethods(“print”,new Class[]{String.class,int.class});
在反射中执行具有可变数量的参数的构造方法时候,要将入口参数定义为二维数组。
2,使用Annotation功能
1.定义Annotation类型
- 定义注解用@interface关键字修饰,可以用元注解注释他的修饰权限和使用权限,元注解是注解注解的注解,注解的元素可以定义默认值,要是没有默认值的话就得每次使用的时候从新定义一下。
元注解@Target可以用枚举类ElementType中的枚举常量修饰注解所用于的程序元素。
元注解@Retention可以用枚举类的RetentionPolicy中的枚举常量来设置Annotation的有效范围其中SOURCE的范围最小,不编译到Annotation文件中,CLASS编译到他中,但不加载到java虚拟机中,RUNTIME范围最大,全都占了。
2,访问Annotation信息(反射)
- 如果Annotation定义时候设置他的范围是RUNTIME,那么他的范围最大,运行时通工反射就可以得到相关信息,比如获取构造方法,字段和方法等。
- 类Constructor,Field和Method军继承了AccessiblePresent类,这个类中提供了三个关于注解的方法
isAnnotationPresent(Class<?extends Annotation>annotationClass);
用来查看是否添加了指定的Annotation方法,有就返回true,不然就返回false
getAnnotation(Class< T >annotationClass);
用来获取指定类型的Annotation,如果存在就返回指定对象,否则返回null
getAnnotations();
获取所有的Annotation,返回一个数组。
System.arraycopy(digest, index1, frame, index2, digest.length);
// 把digest中的内容从第index1个开始复制到frame中去,从frame的第index2开始,总共要复制的长度为 digest.length
第十七章 枚举与泛型
1.枚举类型
1.使用枚举常量
public enum Constants{
Constants_A,
Constants_B,
Constants_C
访问方法是 Constants.Constants_A;
2.操作枚举类型成员
values() | 将枚举成员类型以数组形式返回 |
---|---|
ValusOf | 将普通字符串转换为枚举实例 |
compare To() | 比较两个枚举对象定义时候的顺序c.compare To(b),c在a后面就是正,c在a前面就是负,不然就是0 |
ordinal() | 得到枚举对象的索引位置 |
可以在枚举类型中直接添加构造方法,但这个构造方法必须为private类型。就是可以让枚举成员也包含信息,注意构造方法的参数类型影响枚举成员所包含的数据
出去以上的方法还可以先定义接口,方法放在接口里面,然后枚举成员实现这个接口。
2.泛型
1.定义泛型类
类名<T>
T代表一个类型的名称
使用方法就是先定义泛型,然后可以在类中定义一个泛型类型的数据,然后实例化的时候可以给定泛型的数据类型,之后进行操作。
可以定义多个泛型,定义多个之后要是实例化的时候没有声明泛型类型就当Object类,不然就要好好的定义。
可以用泛型定义数组,但是不能实例化数组。
常被泛型化的集合类由
ArrayList< E>
HashMap<K,V>
HashSet< E>
Vector < E>
j继承泛型的四种情况
限制泛型的可用类型
class 类名称< T extends anyclass >然后T就只能是这个继承的类的子类了。
类型通配符
使用类型通配符所声明的对象只可以获取和删除,不可以添加,类型通配符在声明对象时候使用。
extends制定了类型通配符的上界,super制定了下界。