泛型

Java反射基础

*爱你&永不变心* 提交于 2020-01-08 04:21:29
Java反射机制定义   Java反射机制是指在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。 用一句话总结就是反射可以实现在运行时可以知道任意一个类的属性和方法。 反射机制的优点与缺点 为什么要用反射机制?直接创建对象不就可以了吗,这就涉及到了动态与静态的概念 静态编译:在编译时确定类型,绑定对象,即通过。 动态编译:运行时确定类型,绑定对象。动态编译最大限度发挥了java的灵活性,体现了多态的应用,有以降低类之间的藕合性。 优点 可以实现动态创建对象和编译,体现出很大的灵活性,特别是在J2EE的开发中它的灵活性就表现的十分明显。比如,一个大型的软件,不可能一次就把把它设计的很完美,当这个程序编译后,发布了,当发现需要更新某些功能时,我们不可能要用户把以前的卸载,再重新安装新的版本,假如这样的话,这个软件肯定是没有多少人用的。采用静态的话,需要把整个程序重新编译一次才可以实现功能的更新,而采用反射机制的话,它就可以不用卸载,只需要在运行时才动态的创建和编译,就可以实现该功能。 缺点 对性能有影响。使用反射基本上是一种解释操作,我们可以告诉JVM,我们希望做什么并且它满足我们的要求。这类操作总是慢于只直接执行相同的操作。

C#-where关键字用法

[亡魂溺海] 提交于 2020-01-07 18:12:28
【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>> 接口约束 public class MyGenericClass < T > where T: IComparable { } 基类约束:指出某个类型必须将指定的类作为基类(或者就是该类本身),才能用作该泛型类型的类型参数。这样的约束一经使用,就必须出现在该类型参数的所有其他约束之前。 class MyClassy < T, U > where T : class where U : struct { } where 子句还可以包括构造函数约束。 public class MyGenericClass < T > where T: IComparable , new () { // The following line is not possible without new() constraint: T item = new T(); } new() //约束出现在 where 子句的最后。 对于多个类型参数,每个类型参数都使用一个 where 子句 interface MyI { } class Dictionary < TKey, TVal > where TKey: IComparable , IEnumerable where TVal: MyI { public void Add(TKey key,

C#反射与特性(二):探究反射

人走茶凉 提交于 2020-01-06 11:25:38
目录 1,反射的使用概述 2,获取 Type 在上一章中,我们探究了 C# 引入程序集的各种方法,这一章节笔者将探究 C# 中使用反射的各种操作和代码实践。 1,反射的使用概述 1.1 什么是反射 《C# 7.0 本质论》中: 反射 是指对程序集中的元数据进行检查的过程。 《C# 7.0 核心技术指南》中: 在运行时检查并使用元数据和编译代码的操作称为 反射 。 Microsoft Docs : 反射提供描述程序集、模块和类型的对象。 可以使用反射动态地创建类型的实例,将类型绑定到现有对象,或从现有对象中获取类型,然后调用其方法或访问其字段和属性。 1.2 反射可以做什么 《C# 7.0 本质论》、《C# 7.0 核心技术指南》、《Microsoft Docs》中,关于反射的作用,提纲整理如下: 需要访问程序元数据中的特性时; 检查和实例化程序集中的类型; 在运行时构建新类型( Emit 技术); 执行后期绑定,访问在运行时创建的类型上的方法; 访问程序集中类型的元数据: 其中包括像完整类型名和成员名这样的构造,以及对一个构造进行修饰的任何特性。·使用元数据在运行时动态调用类型的成员,而不是使用编译时绑定。 .NET通过 C# 语言提供的诸多服务(例如动态绑定、序列化、数据绑定和 Remoting)都是依托于元数据的: 我们的应用程序可以充分地利用这些元数据

方法组转换和匿名方法

白昼怎懂夜的黑 提交于 2020-01-06 08:23:21
what 一、定义 Lambda 表达式是一种可用于创建 委托 或 表达式目录树 类型的 匿名函数 。 通过使用 lambda 表达式,可以写入可作为参数传递或作为函数调用值返回的本地函数。 ( 微软 ) 理解 1.Lambda表达式是一种匿名方法。 匿名方法可省略参数列表,Lambda表达式不能省略参数列表的圆括号() //只需要使用一个delegate关键字,加上作为方法的操作使用的代码块。 Action printer = delegate { Console.WriteLine("Hello world"); }; printer(); //一个没有参数的方法,返回值的类型不用指定 系统会自动判断 () => Console.WriteLine() 二、发展 委托 → 匿名方法 → lambda表达式 → 泛型委托 → 表达式树 //委托分3步 //step01:用delegate定义一个委托 public delegate int deleFun(int x,int y); //step02:声明一个方法来对应委托 public static int Add(int x, int y) { return x + y; } static void Main(string[] args) { //step03:用这个方法来实例化这个委托 deleFun dFun = new

JavaWeb中使用JSON

强颜欢笑 提交于 2020-01-05 06:27:12
前言: 最近也是期末了,有好多好多文档和实验报告要交,所以都没啥时间写文,这段时间清闲了,来补一下之前学习时遗漏的一些知识树,话说就没人吐槽这个JSON图标好丑吗? 什么是JSON JSON 指的是 JavaScript 对象表示法( J ava S cript O bject N otation) JSON 是轻量级的文本数据交换格式 JSON 独立于语言 * JSON 具有自我描述性,更易理解 JSON 使用 JavaScript 语法来描述数据对象,但是 JSON 仍然独立于语言和平台。JSON 解析器和 JSON 库支持许多不同的编程语言。 这里有意思的是,JSON本来是用来表示 JavaScript 对象的一种数据文本格式,但由于它轻量级、易于解析/操作(JavaScript原生支持)的一些特点,渐渐的被很多语言支持也就成了一种标准 为什么使用JSON 在JSON之前,我们通常在网络传输中使用的格式是XML,在我们的印象之中,XML具有很好的可读性,并且格式统一,解析起来也相对比较简单,为什么摒弃掉XML而逐渐的使用起JSON呢? 主要原因在于: JSON比XML更小、更快、更易解析。 JavaScript原生支持JSON,解析速度相较XML会更快; XML解析成DOM对象的时候,浏览器之间会产生差异【例如IE和FireFox】;

Java反射基础

末鹿安然 提交于 2020-01-04 06:57:29
Java反射机制定义   Java反射机制是指在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。 用一句话总结就是反射可以实现在运行时可以知道任意一个类的属性和方法。 反射机制的优点与缺点 为什么要用反射机制?直接创建对象不就可以了吗,这就涉及到了动态与静态的概念 静态编译:在编译时确定类型,绑定对象,即通过。 动态编译:运行时确定类型,绑定对象。动态编译最大限度发挥了java的灵活性,体现了多态的应用,有以降低类之间的藕合性。 优点 可以实现动态创建对象和编译,体现出很大的灵活性,特别是在J2EE的开发中它的灵活性就表现的十分明显。比如,一个大型的软件,不可能一次就把把它设计的很完美,当这个程序编译后,发布了,当发现需要更新某些功能时,我们不可能要用户把以前的卸载,再重新安装新的版本,假如这样的话,这个软件肯定是没有多少人用的。采用静态的话,需要把整个程序重新编译一次才可以实现功能的更新,而采用反射机制的话,它就可以不用卸载,只需要在运行时才动态的创建和编译,就可以实现该功能。 缺点 对性能有影响。使用反射基本上是一种解释操作,我们可以告诉JVM,我们希望做什么并且它满足我们的要求。这类操作总是慢于只直接执行相同的操作。

谈谈.NET的协变和逆变

柔情痞子 提交于 2020-01-04 05:25:30
伴随 Visual Studio2010 的发布, C# 这门语言提供一些新的特性,包含协变( Covariant )和逆变( Contravariant )、动态( Dynamic )和 DLR 、命名参数和可选参数、索引属性、 COM 调用优化和嵌入 COM 互操作类型。写本文的目的主要是探讨下泛型类型的协变和逆变,按照以往版本 .NET 新特性的增加,一般是由新的关键字、 Attribute 来标注,继而编译器或者 .NET Runtime 负责解析执行。这两个新特性也是如此,两个关键字 in/out 。 目录 1. 协变逆变的 追本溯源 2. 协变逆变的 深入分析 3. 协变逆变的 场景应用 4. 总结 一. 追本溯源 协变和逆变需 .NET Runtime的支持,但是在以往的几个.NET 版本中,都是提供这种支持。可能大家都纳闷了,C#只是支持.NET平台的一门语言,这两者关系表明C#语言不支持,我们只有干瞪眼,还好沉寂了好几个版本之后,千呼万唤始出来。简明分析下应用场景变迁:以前都是面向对象编程,现在逐渐面向服务编程,泛型类型大量在程序设计结构中的使用,以及.NET3.0 LINQ等等应用活跃。还是举一个code场景,对于泛型接口IEnumerable<T>和IEnumerator<T>,我们经常在foreach循环进行操作,为了保证服务接口的共用性、稳定性、代码重用

C#泛型集合与非泛型集合

拜拜、爱过 提交于 2020-01-03 23:21:07
通过本文,介绍下泛型的优势。 在.NET平台最初发布时,程序员使用System.Collections命名空间下的ArrayList,HashTable,Queue,SortedList,Stack。但历史证明使用这些类型会导致问题。 第一个问题:导致性能的下降。在操作数据结构时(如值类型),CLR必须执行大量的内存转换操作(装箱/拆箱),这回降低运行时的执行速度。 int a = 25;//将int装箱为object应用object boxeda=a;//将引用拆箱为对应的intint unboxeda=(int)boxeda; 这段代码,在内存中会发生如下过程: 1.在栈上分配a=25; 2.在托管堆上分配一个新对象; 3.基于栈数据的值被转移到新分配的内存位置; 4.在拆箱时,保存在堆对象中的值转移回栈; 5.堆上无用的对象会被回收(GC回收); 第二个问题:这些集合类不是类型安全的。 在一个Person类中添加一个非Person对象将在编译时错误 和非泛型相比,泛型有以下优势: 1.提供了更好的性能,不会导致装箱或拆箱的损耗 2.更类型安全,只包含我们指定的类型 3.大幅减少了构建自定义结合类型的需要 泛型类:Dictionary<TKey,TValue>,List<T>,LinkedList<T>,Queue<T>,SortedDictionary<TKey,TValue

java泛型中的通配符

二次信任 提交于 2020-01-02 22:05:14
今天在看ArrayList原码是看到这样的一个符号,好奇怪。 ?表示通配符,表示的意思是匹配E或E的子类,具体类型未知。 1.限定通配符 编写一个类似于ArrayList的动态数据 public class Gys<T> { private final static int default_capacity =10; private int endIndex =0; private Object[] elemts; public Gys() { this.elemts = new Object[default_capacity]; } public void add(T t){ if(elemts.length-1< endIndex){ int newCapcti= default_capacity *2; elemts= Arrays.copyOf(elemts,newCapcti); } elemts[endIndex++]=t; } public void addAll(Gys<T> cs){ for(int i=0;i<cs.size();i++){ add(cs.get(i)); } } public int size(){ return endIndex; } public T get(int i){ if(i< endIndex){ return (T)

Java泛型

空扰寡人 提交于 2020-01-02 09:58:14
什么是泛型? 泛型就是 参数化类型 ,它的作用就是把变量或者属性或者方法的参数或者方法的返回值等的类型看做是一个参数。这样就可以写出来通用的代码,让代码更加简洁。在使用的时候,传入真正的类型。这个过程类似于方法的形参和实参。 为什么要用泛型? 原因一:优化代码,让代码更简洁更通用。 例如:拿打印数组来说,可以定义一个工具类ArrayTool,ArrayTool提供打印数组的方法。 public class ArrayTool { public void printArray ( int [ ] arr ) { for ( int i = 0 ; i < arr . length ; i ++ ) { System . out . println ( arr [ i ] ) ; } } public void printArray ( Integer [ ] arr ) { for ( int i = 0 ; i < arr . length ; i ++ ) { System . out . println ( arr [ i ] ) ; } } public void printArray ( Double [ ] arr ) { for ( int i = 0 ; i < arr . length ; i ++ ) { System . out . println ( arr