参考
泛型
泛型即参数化类型,也就是说操作的数据类型被指定为一个参数。有泛型类、泛型接口、泛型方法三种使用方式
泛型类:
class 类名称 <泛型标识> {
private 泛型标识 /*(成员变量类型)*/ 变量名;
.....
}
}
约定俗称的泛型标识有
T :代表一般的任何类。
E :代表 Element 元素的意思,或者 Exception 异常的意思。
K :代表 Key 的意思。
V :代表 Value 的意思,通常与 K 一起配合使用。
S :代表 Subtype 的意思,文章后面部分会讲解示意。
打印不同类型数组元素的泛型方法:
public class GenericMethodTest
{
// 泛型方法 printArray <E>是类型参数声明部分,位于返回类型前
public static < E > void printArray( E[] inputArray )
{
// 输出数组元素
for ( E element : inputArray ){
System.out.printf( "%s ", element );
}
System.out.println();
}
public static void main( String args[] )
{
// 创建不同类型数组: Integer, Double 和 Character
Integer[] intArray = {
1, 2, 3, 4, 5 };
Double[] doubleArray = {
1.1, 2.2, 3.3, 4.4 };
Character[] charArray = {
'H', 'E', 'L', 'L', 'O' };
System.out.println( "整型数组元素为:" );
printArray( intArray ); // 传递一个整型数组
System.out.println( "\n双精度型数组元素为:" );
printArray( doubleArray ); // 传递一个双精度型数组
System.out.println( "\n字符型数组元素为:" );
printArray( charArray ); // 传递一个字符型数组
}
}
注解
定义:注解是附加在代码中的一些元信息,用来将信息或元数据(metadata)与程序元素(类、方法、成员变量等)进行关联,供一些工具在编译运行时解析并使用,起到说明、配置的功能。
主要用途:
- 生成文档。
- 进行格式检查:如使用 @Override注解放在方法前,若实际并未进行覆盖超类方法,则编译时可检查出来。
- 跟踪代码依赖性,简化配置过程:如spring使用的基于注解的配置。
分类
- 标准注解:- 元注解:注解的注解- 自定义注解
类型定义为@interface
,所有的Annotation自动继承java.lang.Annotation这一接口且不能再继承其他类或接口,其成员只能用public或default修饰,要获取类方法和变量的注解信息必须通过反射技术获取Annotation对象,自定义注解需要使用到元注解。
反射
定义:反射允许运行中的Java程序对自身进行检查,正常情况下被private修饰的成员只能在类内部访问,但反射能直接操作类的私有成员(变量、方法、构造器等)
类的加载过程:程序经过javac命令后编译出字节码文件(xxx.class),用java命令对字节码文件进行加载和运行,加载到内存中的类就被称为运行时类,是字节码文件class的一个实例。
java.lang.Class类:上文所说的被加载后的xxx.class其实就是Class类的一个对象,也就是说Class类是类的类。
反射的动态性
//体会反射的动态性
@Test
public void test2(){
for(int i = 0;i < 100;i++){
int num = new Random().nextInt(3);//0,1,2
String classPath = "";
switch(num){
case 0:
classPath = "java.util.Date";
break;
case 1:
classPath = "java.lang.Object";
break;
case 2:
classPath = "com.atguigu.java.Person";
break;
}
try {
Object obj = getInstance(classPath);
System.out.println(obj);
} catch (Exception e) {
e.printStackTrace();
}
}
}
/*
创建一个指定类的对象。
classPath:指定类的全类名
*/
public Object getInstance(String classPath) throws Exception {
// 传入全类名,获取classPath的类对应Class类的实例
Class clazz = Class.forName(classPath);
// 实例化classPath对应的类
return clazz.newInstance();
}
}