泛型

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中的泛型和反射相关推荐

  1. java如何用反射把具体方法抽象_如何在Java 中使用泛型或反射机制对DAO进行抽象...

    如何在Java 中使用泛型或反射机制对DAO进行抽象 发布时间:2020-11-26 16:07:42 来源:亿速云 阅读:80 作者:Leah 本篇文章为大家展示了如何在Java 中使用泛型或反射机 ...

  2. [转载] 详解Java中的泛型

    参考链接: Java中具有泛型的有界类型 1.什么是泛型 泛型,即"参数化类型".一提到参数,最熟悉的就是定义方法时有形参,然后调用此方法时传递实参.那么参数化类型怎么理解呢?顾名 ...

  3. 聊聊Java中的泛型

    聊聊Java中的泛型 文章目录 聊聊Java中的泛型 参考资料 一.概述 1. 泛型的定义 1.1 定义 1.2 常见形式 2. 为什么需要泛型 3. 泛型的优点 4. 泛型的使用 4.1 泛型类 4 ...

  4. Java中创建泛型数组

    Java中创建泛型数组 使用泛型时,我想很多人肯定尝试过如下的代码,去创建一个泛型数组 T[] array = new T[]; 当我们写出这样的代码时编译器会报Cannot create a gen ...

  5. Java中的泛型 --- Java 编程思想

    前言 ​ 我一直都认为泛型是程序语言设计中一个非常基础,重要的概念,Java 中的泛型到底是怎么样的,为什么会有泛型,泛型怎么发展出来的.通透理解泛型是学好基础里面中非常重要的.于是,我对<Ja ...

  6. java定义list_我的Java Web之路59 - Java中的泛型

    本系列文章旨在记录和总结自己在Java Web开发之路上的知识点.经验.问题和思考,希望能帮助更多(Java)码农和想成为(Java)码农的人. 目录 介绍 再谈Java中的类型 为什么需要泛型? J ...

  7. java中的泛型(E)

    java中的泛型(E) 泛型:就是一种不确定的数据类型. 比如:ArrayList E就是泛型. 这种不确定的数据类型需要在使用这个类的时候才能够确定出来. 泛型可以省略,如果省略,默认泛型是Obje ...

  8. Java中的泛型全解析(二)

    Java中的泛型全解析(一) 泛型中的约束和局限性 现在我们有泛型类 不能用基本类型实例化类型参数 运行时类型查询只适用于原始类型 泛型类的静态上下文中类型变量失效 不能在静态域或方法中引用类型变量. ...

  9. Java中的泛型全解析(一)

    为什么我们需要泛型? 通过两段代码我们就可以知道为何我们需要泛型 实际开发中,经常有数值类型求和的需求,例如实现int类型的加法, 有时候还需要实现long类型的求和, 如果还需要double类型的求 ...

最新文章

  1. php 远程下载图片到本地
  2. java导出多个excel并打成zip包
  3. ic卡消费管理系统_智能食堂管理解决方案 智能刷卡消费
  4. 使用vim转换文件编码
  5. HNOI2018游记
  6. (JAVA)StringBuffer类
  7. idea html 错误提示,Idea 代码编辑错误不飘红提示
  8. sublime text 3 3103 注册码
  9. C# 序列化理解 1(转)
  10. Linux Framebuffer驱动剖析之中的一个—软件需求
  11. Android手机网页字体异常,移动端html5手机网站的中文字体使用
  12. Android解析SRT字幕文件
  13. 笔记本共享网络给台式机
  14. [原创]找小丑-你要做小丑,还是主宰小丑的那个?
  15. 树形结构数据, 已知某一子节点 ,一次向上获取所有父节点
  16. 网址出现dns_probe_finished_no_internet
  17. 385高校毕业设计选题
  18. Android Studio百度地图仿QQ发说说选择位置功能
  19. OC textField键盘弹起事件
  20. 银行本、异地,本、跨行存取款收费比较

热门文章

  1. c语言判断字符是否等于e,C语言如何实现删除字符串中的字符
  2. 为什么进mysql需要用户和密码了_centos5安装 mysql 提示需要用户及密码进入?
  3. 归纳推理测试没做完_看她家新房,保洁做完还没家具就很漂亮,墙面刷灰色耐看又耐脏...
  4. linux 定时器中断 imx,NXP iMX8 存储性能测试
  5. java 微商城开发_Java网上商城系统可以开微信商城吗
  6. 北航研究生计算机学院,北航计算机学院考研经验
  7. linux用绝对路径执行mysql命令_Linux 相对路径和绝对路径的使用
  8. 博士申请 | 香港科技大学陈浩教授招收AI医疗方向全奖博士/博后/实习生
  9. 活动报名 | PaddlePaddle Hackathon飞桨黑客马拉松邀你参加
  10. 旷视 CVPR 2021 论文解读直播来喽!