2022-05-21泛型和反射

java泛型

本质:提供了变异时的类型安全的检测机制,泛型的本质就是参数化类型,给类型提供一个指定的参数。

为什么使用泛型:
1.保证类型的安全;
当我们以前没有泛型的时候,在运行的时候,从集合中读取的对象都要进行类型转换,若是我们不小心插入错误的类型对象,当我们在获取的时候就会出现类型不匹配的错误,就是转换错误。

public static void noGeneric() {
 
ArrayList names = new ArrayList();
 
names.add("mikechen的互联网架构");
 
names.add(123); //编译正常

但是当我们的有了泛型之后,在程序编译的时候就会显示错误,使得程序更加的安全,更加的健壮。


public static void useGeneric() {
 
ArrayList 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 obj)
 
{
  return obj;
}
 
public static void Main()
{
      int i = 1;
  int j=GetValue(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 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);
        }
    }
}

当然反射还有很多的别的用途:如更改配置文件,动态调用类库中的一些方法和属性等

你可能感兴趣的:(2022-05-21泛型和反射)