Java泛型和反射总结

一、Java 泛型
 
          1、  泛型的标记符号:
               E - Element  元素
               T - Type  类型
                K - Key  键
                V - Value  值
               N - Number  数值类型
                ? - 不确定类型(通配符)
        注意基本数据类型要作为泛化参数时需要用包装类型
            int - Integer
            char - Character
            double - Double
             float - Float
            boolean - Boolean
             short - Short
             long - Long
            byte - Byte
 
        2、  ?通配符
                 <? extends T> 表示类型上界,表示可以接收该类型 T 或者 T 的子类
                <? super T> 表示类型下界,表示参数化类型是 T 类或者是 T 的父类
                <? extends T> 不确定类型,虚拟机无法分配空间 , 一般是只能读取,不能设置内容( null 除外)
              // 接收的就是 Man 以及它的子类(不能设置只能读取)
            MyArrayList<? extends Man> list2 = new MyArrayList<Man>();
            // 该类型或者其父类
            MyArrayList<? super Man> list3 = new MyArrayList<Man>();
            泛型方法
             泛型方法在定义时,需要在返回值之前加上一个 <T>, 如
           public static <T> void test(T t){
            }
          public <T> T test(T t){
         }
 
二、     Java 反射

              Java 反射是可以让我们在运行时来操作类的方法、属性、父类、接口等 , 所有的 Java 文件都会被编译为 .class 文件, class 文件最终会被 ClassLoader 加
       载到虚拟机中去执行,加载过程中每个 class 文件会自动生成对应的 Class 对象
       1、Class 对象的获取
           // 基于类名 .class 获取 Class 实例
            Class<?> cls = Person.class;
           // 使用对象的 getClass 方法获取
           Person p1 = new Person();
           Class<?> cls2 = p1.getClass();
           try {
            Class<?> cls3 = Class.forName("com.types.Person");
             } catch (ClassNotFoundException e) {
           // TODO Auto-generated catch block
       e.printStackTrace();
        }

         2、方法调用
// 获取所有构造方法
Constructor<?>[] constr = cls.getConstructors();
// 获取一个精确的构造
Constructor<?> constructor = cls.getConstructor(String.class,int.class);
在反射的使用时如果要操作方法建议去掉 Java 语言环境的检测,通过以下方式去掉即可 ( 对所有方法有效 )
constructor.setAccessible(true);
使用构造方法创建对象
Person p = (Person) constructor.newInstance(" 张三 ",18);
使用无参构造创建
Person p2 = (Person) cls.newInstance();
获取方法(普通方法)
获取本类中所有定义的方法包括 private 、 public 、 protected 、 default
Method[] ms = cls.getDeclaredMethods();
// 获取所有公开方法(包括父类中的公开方法直到 Object )
Method[] ms = cls.getMethods();
// 获取精确的方法
Method m = cls.getDeclaredMethod("wearClothes", String.class);
m.setAccessible(true);
// 执行方法
boolean r = (Boolean)m.invoke(p, " 运动服 ");

      3、 属性操作
// 获取某一个精确的属性
Field f = cls.getDeclaredField("name");
// 设置属性值
f.setAccessible(true);
f.set(p, " 李四 ");
// 获取某一个精确的属性
Field fa = cls.getDeclaredField("a");
// 设置属性值
fa.setAccessible(true);
fa.set(p, 100);
获取父类
// 获取父类 (Object 的父类是 null)
Class<?> superCls = cls.getSuperclass();
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

KM-人工智能

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值