泛型与反射

泛型

所谓泛型就是指,数据类型的参数化。例如:ArrayList list.

泛型有两种形式:泛型类、接口,泛型方法。

泛型类

定义

在定义时,定义类型
再早起JDK版本中没有反省,不确定的数据类型使用Object。从JDK1.5开始增加泛型。
语法:

	public class 类型<泛型名,泛型名>{
	}
	泛型名通常都使用一个大写字母来表示。

不能使用泛型进行创建对象。

使用

当一个类声明泛型后,在类中,就可以使用泛型代替数据类型。

在这里插入图片描述
【注意】

  1. 当使用泛型类声明变量时,需要指定泛型。此时,在对象所有的泛型中需要执行数据类型。
    在这里插入图片描述
  2. 泛型不能使用基本数据类型,但可以使用包装类。
  3. 当声明泛型类的变量时,如果不执行泛型时,则泛型为Object。
  4. 不能使用泛型进行创建对象
    在这里插入图片描述

泛型的传递

//Dao类一般不使用泛型类

  1. 直接指定父类的泛型

     public class 子类 extends 父类<数据类型>{
     }
    
  2. 传递子类的泛型

     public class 子类<T> extends 父类<T>{
     }
    

泛型方法

  1. 定义

     public <T> 返回值类型 方法名(参数列表){
     }
     在方法上声明的泛型,只能在当前方法上使用。
    
  2. 使用

     在方法上声明的泛型,只能在当前方法上使用。
     1)声明变量
     2)参数的数据类型,应该指定泛型,如果参数中没有指定数据类型,默认为Object类型。
     3)方法的返回值类型
    

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

泛型的上下限

使用泛型时,可以设置泛型的数据类型最上限和最下限。

  1. 参数类型的指定
    参数中可以使用具体类型指定泛型。
    也可以使用?指定泛型可以接受任何类型。
    在这里插入图片描述
    在这里插入图片描述

  2. 泛型的上限

  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();

获取类的信息

  1. 基本信息

    类名
    包名
    父类
    父接口

  2. 获取类的属性

    公共属性
    cls.getField(name)
    cls.getFields()
    声明的属性
    cls.getDeclaredFiled(name)
    cls.getDeclaredFileds();
    属性的调用
    field.get(对象)
    field.set(对象,值)
    私有属性调用
    field.setAccessible(true)
    
  3. 获取类的方法

    公共属性
    cls.getMethod(name)
    cls.getMethods()
    声明的属性
    cls.getDeclaredMethod(name,参数类型)
    cls.getDeclaredMethods()
    属性的调用
    method.ginvoke(对象,参数)
    私有属性调用
    method.setAccessible(true)
    
  4. 获取类的构造方法

    调用无参构造
    cls.newInstance();
    获取构造方法
    cls.getConstructor(参数类型);
    调用构造方法创建对象
    constructor.newInstace(参数)
  5. Java中创建对象的方式

    1. new 类名()
    2. clone()方法//重写Object类的clone方法,实现接口Conable
    3. truansient忽略字段的序列化和反序列化操作【反序列化:serializable接口】
    4. 反射:
    class.newInstance()
    constructor.newInstance(参数);
    

在这里插入图片描述
在这里插入图片描述
Introspector 内省
getBeanInfo()
在这里插入图片描述
用反射来编写查询方法:

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值