【笔记】JAVA中的泛型和反射
泛型
Java的泛型是如何工作的?什么是类型擦除?
----泛型是通过类型擦除来实现的,编译器在编译时擦除了所有类型相关的信息,所以在运行时不存在任何类型相关的信息。例如List在运行时仅用一个List来表示。这样做的目的是确保能和Java 5之前的版本开发二进制类库兼容。无法在运行时访问到类型参
数,因为编译器已经把泛型类型转换成了原始类型。
**泛型提供了编译期的类型安全,确保只能把正确类型的对象放入集合中,**避免了在运行时出现ClassCastException。
利用泛型方法,还可以定义具有可变参数的方法,如printf()方法,具体格式如下:
System.out.printf("%d,%f\n",i,f);
System.out.printf(“x=%d,y=%d,z=%d”,x,y,z);
定义时“类型参数名”后面一定要加上“…”,表示是可变参数。“参数名”实际上是一个数组,当具有可变参数的方法被调用时,是将实际参数放到各个数组元素中。
public class test{static <T> void print(T..ts)
{//泛型方法,形参是可变参数
for(int i = 0;i < ts.length;i++)
{System.out.PrintIn(ts[i]+" ");
}
}
public static void main(String args[]){String fruit[] = ["apple","pear","peach"];
print(fruit);
}}
泛型接口:
interface test<T>
{public T next();
}
在Java中,泛型增加了许多新的特性,其中最主要的有两个:使用“::”对方法和构造方法进行引用,以及Lambda表达式的作用域。
方法与构造方法引用
Java中可以使用“::”传递方法或构造函数引用。
//创建接口。
public interface
InterNew<String, Integer> {Integer InterNew(String string);}
//创建引用静态方法的类。
public class FuncNew {public static void main(String[] args){//引用静态方法valueOf()
InterNew<String, Integer> in2 = Integer::valueOf;
//使用valueOf()方法将字符串转换为Integer类型
Integer i2 = in2.InterNew("25");
System.out.println("方法引用-String -> Integer:" + i2);
}
}
反射
在程序运行过程中,对于任意一个对象,都能够知道这个对象所在类的所有属性和方法,都能够调用它的任意一个方法和访问它的任意一个属性,这种动态调用对象的方法及动态获取信息的功能称为Java语言的反射机制。
通过Java的反射机制,程序员可以方便、灵活地创建代码,这些代码可以在运行时进行装配,在程序运行过程中可以动态地扩展程序。
Java的反射机制主要有以下功能:
·在运行时判断任意一个对象所属的类。
·在运行时构造任意一个类的对象。
·在运行时判断任意一个类所具有的成员变量和方法。
·在运行时调用任意一个对象的方法。
·生成动态代理。
Java提供的反射所需要的类主要有java.lang.Class类和java.lang.reflect包中的Field类、Constructor类、Method类和Array类等。
·Class类的实例表示正在运行的Java应用程序中的类和接口。它是Java反射的基础,对于任何一个类,首先要产生一个Class的对象,然后才可以通过Class类获得其他的信息。
·Field类提供有关类或接口的单个字段的信息以及对它的动态访问权限。反射的字段可能是一个类(静态)字段或实例字段。该类封装了反射类的属性。
·Constructor类提供关于类的单个构造方法的信息以及对它的访问权限。该类封装了反射类的构造方法。
·Method类提供关于类或接口上单独某个方法的信息,该方法可能是类方法或实例方法(包括抽象方法)。该类是用来封装反射类的方法。
·Array类提供了动态创建和访问Java数组的方法。它提供的方法都是静态方法。
Class类
Java程序运行时,系统对所有对象赋予运行时类型标识,Class类是用来保存类型信息的类。Java虚拟机为每种类型管理着一个独一无二的Class类。即Java虚拟机中会有一个Class对象,保存运行时的类和接口的类型信息。
获取Class类对象
在Java语言中,获取Class类对象的方式有3种,具体如下。
(1)通过Object类提供的getClass()方法获得Class类对象。这是获取Class类对象最常见的一种方式,具体格式如下:
Object obj = new Object(); //创建Object类对象
Class c1 = obj.getClass(); //调用Object类的getClass()方法获取Class
(2)通过Class类的静态方法forName()获取字符串参数指定的Class类对象。具体格式如下:
Class c2 = Class.forName(“java.lang.Integer”);
(3)通过“类名.class”获取该类的Class对象。具体格式如下:
Class c3= Integer.class;
c3:通过“类名.class”获取的Class类对象。
生成对象
在Java程序中,通常使用new关键字调用类的构造方法来创建对象。但是,对于一些特殊情况,例如程序只有在运行时才知道要创建对象的类名,就需要使用Java的反射机制来创建对象。使用Java的反射机制创建对象有两种方法,即无参构造方法和有参构造方法。
无参构造方法
若使用无参数的构造方法创建对象,首先要获得这个类的Class类对象,然后调用Class类对象的newInstance()方法。具体代码如下:
Class c2 = Class.forName("java.lang.Integer"); //获得Class类对象
c2.newInstance();
有参构造方法
若使用带参数的构造方法创建对象的具体步骤如下:
(1)获得指定类的Class类对象。
(2)通过反射获取符合指定参数类型的构造方法类(Constructor类)对象。
(3)调用Constructor类对象的newInstance()方法传入对应参数值,创建对象。
import java.lang.reflect.*;
public class ClassObj {public static void main(String[] args){//使用有参构造方法创建对象
try {//第一步,获得指定类的Class类对象
Class c5 = Class.forName("java.lang.Integer");
//第二步,通过Class类对象获得指定符合参数类型的构造方法
Constructor construct = c5.getConstructor(int.class);
//第三步,通过Constructor类对象的newInstance()方法传入参数,创建
Integer in = (Integer) construct.newInstance(1246);
} catch (ClassNotFoundException e) {e.printStackTrace();
} catch (NoSuchMethodException e) {e.printStackTrace();
} catch (SecurityException e) {e.printStackTrace();
} catch (InstantiationException e) {e.printStackTrace();
} catch (IllegalAccessException e) {e.printStackTrace();
} catch (IllegalArgumentException e) {e.printStackTrace();
} catch (InvocationTargetException e) {e.printStackTrace();
}
}
【笔记】JAVA中的泛型和反射相关推荐
- java如何用反射把具体方法抽象_如何在Java 中使用泛型或反射机制对DAO进行抽象...
如何在Java 中使用泛型或反射机制对DAO进行抽象 发布时间:2020-11-26 16:07:42 来源:亿速云 阅读:80 作者:Leah 本篇文章为大家展示了如何在Java 中使用泛型或反射机 ...
- [转载] 详解Java中的泛型
参考链接: Java中具有泛型的有界类型 1.什么是泛型 泛型,即"参数化类型".一提到参数,最熟悉的就是定义方法时有形参,然后调用此方法时传递实参.那么参数化类型怎么理解呢?顾名 ...
- 聊聊Java中的泛型
聊聊Java中的泛型 文章目录 聊聊Java中的泛型 参考资料 一.概述 1. 泛型的定义 1.1 定义 1.2 常见形式 2. 为什么需要泛型 3. 泛型的优点 4. 泛型的使用 4.1 泛型类 4 ...
- Java中创建泛型数组
Java中创建泛型数组 使用泛型时,我想很多人肯定尝试过如下的代码,去创建一个泛型数组 T[] array = new T[]; 当我们写出这样的代码时编译器会报Cannot create a gen ...
- Java中的泛型 --- Java 编程思想
前言 我一直都认为泛型是程序语言设计中一个非常基础,重要的概念,Java 中的泛型到底是怎么样的,为什么会有泛型,泛型怎么发展出来的.通透理解泛型是学好基础里面中非常重要的.于是,我对<Ja ...
- java定义list_我的Java Web之路59 - Java中的泛型
本系列文章旨在记录和总结自己在Java Web开发之路上的知识点.经验.问题和思考,希望能帮助更多(Java)码农和想成为(Java)码农的人. 目录 介绍 再谈Java中的类型 为什么需要泛型? J ...
- java中的泛型(E)
java中的泛型(E) 泛型:就是一种不确定的数据类型. 比如:ArrayList E就是泛型. 这种不确定的数据类型需要在使用这个类的时候才能够确定出来. 泛型可以省略,如果省略,默认泛型是Obje ...
- Java中的泛型全解析(二)
Java中的泛型全解析(一) 泛型中的约束和局限性 现在我们有泛型类 不能用基本类型实例化类型参数 运行时类型查询只适用于原始类型 泛型类的静态上下文中类型变量失效 不能在静态域或方法中引用类型变量. ...
- Java中的泛型全解析(一)
为什么我们需要泛型? 通过两段代码我们就可以知道为何我们需要泛型 实际开发中,经常有数值类型求和的需求,例如实现int类型的加法, 有时候还需要实现long类型的求和, 如果还需要double类型的求 ...
最新文章
- php 远程下载图片到本地
- java导出多个excel并打成zip包
- ic卡消费管理系统_智能食堂管理解决方案 智能刷卡消费
- 使用vim转换文件编码
- HNOI2018游记
- (JAVA)StringBuffer类
- idea html 错误提示,Idea 代码编辑错误不飘红提示
- sublime text 3 3103 注册码
- C# 序列化理解 1(转)
- Linux Framebuffer驱动剖析之中的一个—软件需求
- Android手机网页字体异常,移动端html5手机网站的中文字体使用
- Android解析SRT字幕文件
- 笔记本共享网络给台式机
- [原创]找小丑-你要做小丑,还是主宰小丑的那个?
- 树形结构数据, 已知某一子节点 ,一次向上获取所有父节点
- 网址出现dns_probe_finished_no_internet
- 385高校毕业设计选题
- Android Studio百度地图仿QQ发说说选择位置功能
- OC textField键盘弹起事件
- 银行本、异地,本、跨行存取款收费比较
热门文章
- c语言判断字符是否等于e,C语言如何实现删除字符串中的字符
- 为什么进mysql需要用户和密码了_centos5安装 mysql 提示需要用户及密码进入?
- 归纳推理测试没做完_看她家新房,保洁做完还没家具就很漂亮,墙面刷灰色耐看又耐脏...
- linux 定时器中断 imx,NXP iMX8 存储性能测试
- java 微商城开发_Java网上商城系统可以开微信商城吗
- 北航研究生计算机学院,北航计算机学院考研经验
- linux用绝对路径执行mysql命令_Linux 相对路径和绝对路径的使用
- 博士申请 | 香港科技大学陈浩教授招收AI医疗方向全奖博士/博后/实习生
- 活动报名 | PaddlePaddle Hackathon飞桨黑客马拉松邀你参加
- 旷视 CVPR 2021 论文解读直播来喽!