java泛型
本质:提供了变异时的类型安全的检测机制,泛型的本质就是参数化类型,给类型提供一个指定的参数。
为什么使用泛型:
1.保证类型的安全;
当我们以前没有泛型的时候,在运行的时候,从集合中读取的对象都要进行类型转换,若是我们不小心插入错误的类型对象,当我们在获取的时候就会出现类型不匹配的错误,就是转换错误。
public static void noGeneric() {
ArrayList names = new ArrayList();
names.add("mikechen的互联网架构");
names.add(123); //编译正常
但是当我们的有了泛型之后,在程序编译的时候就会显示错误,使得程序更加的安全,更加的健壮。
public static void useGeneric() {
ArrayList<String> names = new ArrayList<>();
names.add("mikechen的互联网架构");
names.add(123); //编译不通过
2.消除了强制转换
在之前,我们没有泛型的之后就算获取的了类型就是我们想要的类型,但是还是需要进行强制转换。
3.避免了不必要的装箱和拆箱操作
这里的装箱操作就是将我们的值转换为引用类型:
拆箱操作就是将我们的引用类型转换为值;
int i=1;
object obj = i;
//将i转换为了obj引用类型,就是装箱操作
int j = (int)obj;
//将obj的引用变量的值赋值给了值类型的变量,就是我们所说的拆箱;
上面的代码我们通过泛型:
public static T GetValue<T>(T obj)
{
return obj;
}
public static void Main()
{
int i = 1;
int j=GetValue<int>(i);//使用这个方法的时候已经指定了类型是int,也就是值类型,所以不会有装箱和拆箱的操作。
}
4.提高了代码的重用性
java反射:
解释:JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。
反射就是把java类之中的各种成分映射成一个个的java对象,jvm虚拟机会在加载类的时候自动帮我们产生对应的class对象,我们使用的时候只需要获取到这个class对象就可以知道这个类之中的所有的方法和属性;
我们可以使用反射来越过泛型检查:
import java.lang.reflect.Method;
import java.util.ArrayList;
/*
* 通过反射越过泛型检查
*
* 例如:有一个String泛型的集合,怎样能向这个集合中添加一个Integer类型的值?
*/
public class Demo {
public static void main(String[] args) throws Exception{
ArrayList<String> strList = new ArrayList<>();
strList.add("aaa");
strList.add("bbb");
// strList.add(100);
//获取ArrayList的Class对象,反向的调用add()方法,添加数据
Class listClass = strList.getClass(); //得到 strList 对象的字节码 对象
//获取add()方法
Method m = listClass.getMethod("add", Object.class);
//调用add()方法
m.invoke(strList, 100);
//遍历集合
for(Object obj : strList){
System.out.println(obj);
}
}
}
当然反射还有很多的别的用途:如更改配置文件,动态调用类库中的一些方法和属性等