泛型
所谓泛型就是指,数据类型的参数化。例如:ArrayList list.
泛型有两种形式:泛型类、接口,泛型方法。
泛型类
定义
在定义时,定义类型
再早起JDK版本中没有反省,不确定的数据类型使用Object。从JDK1.5开始增加泛型。
语法:
public class 类型<泛型名,泛型名>{
}
泛型名通常都使用一个大写字母来表示。
不能使用泛型进行创建对象。
使用
当一个类声明泛型后,在类中,就可以使用泛型代替数据类型。
【注意】
- 当使用泛型类声明变量时,需要指定泛型。此时,在对象所有的泛型中需要执行数据类型。
- 泛型不能使用基本数据类型,但可以使用包装类。
- 当声明泛型类的变量时,如果不执行泛型时,则泛型为Object。
- 不能使用泛型进行创建对象
泛型的传递
//Dao类一般不使用泛型类
-
直接指定父类的泛型
public class 子类 extends 父类<数据类型>{ }
-
传递子类的泛型
public class 子类<T> extends 父类<T>{ }
泛型方法
-
定义
public <T> 返回值类型 方法名(参数列表){ } 在方法上声明的泛型,只能在当前方法上使用。
-
使用
在方法上声明的泛型,只能在当前方法上使用。 1)声明变量 2)参数的数据类型,应该指定泛型,如果参数中没有指定数据类型,默认为Object类型。 3)方法的返回值类型
泛型的上下限
使用泛型时,可以设置泛型的数据类型最上限和最下限。
-
参数类型的指定
参数中可以使用具体类型指定泛型。
也可以使用?指定泛型可以接受任何类型。
-
泛型的上限
-
泛型的下限
反射
常规操作:要先知道一个类,才能创建这个类的对象,才能调用这个类属性和方法
反射操作:事先不知道这是一个什么类,JVM运行过程,会将类的信息加载到方法中,从方法中可以获取这个类的一切信息。
通过获取的类信息调用这个类完成相关的操作。
1. 获取类的信息
Class.forName(className)
Person p=new Person();
String className="com.st.demo041101.Persion";
try{
//让JVM加载一个指定的名字的类,加载成功返回该类对应的Class对象
//Class就是一个类的档案
Class cls=Class.forName(className);
//获取这个类的信息
cls.getName();
cls.getPackage();
cls.getInterfaces();//获取接口
cls.getSuperClass();//获取父类
//获取类的属性
Field ageField=cls.getField("age");
//ageField这个对象,代表的时Person类的一个叫做age的属性;
Field[] fields=cls.getFields();
cls.getDeclaredField("age");
cls.getDeclaredFields();//可以获取直接声明的属性字段
//在该类的对象上获取,设置属性
Person p=new Person();
ageField.set(p,(Object)12);//反射将值传给对象。
//对私有的属性进行处理
Field nameField=cls.getField("name");
nameField.setAccessible(true);//权限禁止检查
nameField.set(p,(Object)"Jerry");
//获取方法
Method getNameMethod=cls.getDeclaredMethod("getName");
getNameMethod.getName();
getNameMethod.getReturnType();
getNameMethod.getParameters();
//调用Method
getNameMethod.setAccessible(true);
getNameMethod.invoke(p,value);//invoke 引用
//直接调用无参构造方法
Person p2=(Person) cls.newInstance();
//获取有参构造方法
Constructor c1=cls.getConstructor(String.class);
Person p3=(Person)c1.newInstance("Jack");
Constructor c2=cls.getConstructor(Integer.class);
Person p4=(Person)c2.getConstructor(12);
}catch(ClassNotFoundException e){
throw new RuntimeException(e);
}catch(Exception e){
throw new RuntimeException(e);
如何获取一个类的Class对象
1. 类名.class
2. Class.forName(“全类名”);
3. 对象.getClass();
获取类的信息
-
基本信息
类名
包名
父类
父接口 -
获取类的属性
公共属性 cls.getField(name) cls.getFields() 声明的属性 cls.getDeclaredFiled(name) cls.getDeclaredFileds(); 属性的调用 field.get(对象) field.set(对象,值) 私有属性调用 field.setAccessible(true)
-
获取类的方法
公共属性 cls.getMethod(name) cls.getMethods() 声明的属性 cls.getDeclaredMethod(name,参数类型) cls.getDeclaredMethods() 属性的调用 method.ginvoke(对象,参数) 私有属性调用 method.setAccessible(true)
-
获取类的构造方法
调用无参构造 cls.newInstance(); 获取构造方法 cls.getConstructor(参数类型); 调用构造方法创建对象 constructor.newInstace(参数);
-
Java中创建对象的方式
1. new 类名() 2. clone()方法//重写Object类的clone方法,实现接口Conable 3. truansient忽略字段的序列化和反序列化操作【反序列化:serializable接口】 4. 反射: class.newInstance() constructor.newInstance(参数);
Introspector 内省
getBeanInfo()
用反射来编写查询方法: