zoukankan      html  css  js  c++  java
  • java的泛型与反射机制

    什么是泛型?

    泛型,即“参数化类型”。顾名思义,就是将类型由原来的具体的类型参数化,类似于方法中的变量参数,此时类型也定义成参数形式(可以称之为类型形参),然后在使用/调用时传入具体的类型(类型实参)。

    为什么要使用泛型?

    先看如下代码:

    public class GenericTest {
    
        public static void main(String[] args) {
            List list = new ArrayList();
            list.add("qqyumidi");
            list.add("corn");
            list.add(100);
    
            for (int i = 0; i < list.size(); i++) {
                String name = (String) list.get(i); // 1
                System.out.println("name:" + name);
            }
        }
    }

     在如上的编码过程中,我们发现主要存在两个问题:

      1.当我们将一个对象放入集合中,集合不会记住此对象的类型,当再次从集合中取出此对象时,改对象的编译类型变成了Object类型,但其运行时类型任然为其本身类型。

      2.因此,//1处取出集合元素时需要人为的强制类型转化到具体的目标类型,且很容易出现“java.lang.ClassCastException”异常。

    使用泛型后写法:

    public class GenericTest {
    
        public static void main(String[] args) {
            /*
            List list = new ArrayList();
            list.add("qqyumidi");
            list.add("corn");
            list.add(100);
            */
    
            List<String> list = new ArrayList<String>();
            list.add("qqyumidi");
            list.add("corn");
            //list.add(100);   // 1  提示编译错误
    
            for (int i = 0; i < list.size(); i++) {
                String name = list.get(i); // 2
                System.out.println("name:" + name);
            }
        }
    }

    采用泛型写法后,在//1处想加入一个Integer类型的对象时会出现编译错误,通过List<String>,直接限定了list集合中只能含有String类型的元素,从而在//2处无须进行强制类型转换,因为此时,集合能够记住元素的类型信息,编译器已经能够确认它是String类型了。

     

    反射机制是什么?

     

    反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。

    反射机制能做什么?

    反射机制主要提供了以下功能: 

    • 在运行时判断任意一个对象所属的类;

    • 在运行时构造任意一个类的对象;

    • 在运行时判断任意一个类所具有的成员变量和方法;

    • 在运行时调用任意一个对象的方法;

    • 生成动态代理。

    反射机制的实用案例

    利用反射机制获取类的方法名、返回值、参数,代码如下

    package fanxingText;
    
    import java.lang.reflect.Method;
    import java.util.ArrayList;
    import java.util.List;
    
    public class FxTest {
    
        public static void main(String[] args) {
            
            List l = new ArrayList<>();        
            pointClassInfo(l);
            
        }
    
        public static void pointClassInfo(Object o){
            
            Method[] methods = (o.getClass()).getMethods();
            
            for(Method method : methods){
                System.out.print(method.getReturnType().getName() +" ");
                System.out.print(method.getName() +" " + "(");
                for(Class c : method.getParameterTypes()){
                    System.out.print(c.getName()+ ",");
                }
                System.out.println(")"); 
            }
        }
    }

    利用反射机制将泛型为String的ArrayList中存放一个Integer类型的对象,代码如下:

    package fanxingText;
    
    import java.lang.reflect.Method;
    import java.util.ArrayList;
    import java.util.List;
    
    public class SetArrayList {
    
        public static void main(String[] args) throws Exception {
            
            SetArrayListOtherParam();
                
        }
        
        @SuppressWarnings({ "rawtypes", "unchecked" })
        public static void SetArrayListOtherParam() throws Exception{
            List<String> strings = new ArrayList<String>();
            
            System.out.println(strings.add("111"));
                    
            Class c = strings.getClass();
            
            Method m  = c.getMethod("add",Object.class);
            
            m.invoke(strings, 1000);
            
            for(Object o : strings){
                System.out.println(o);
            }
            
            
        }
    
    }

     

  • 相关阅读:
    单工-半双工-双工
    为你的Windows7设置动态壁纸
    Vmware为Ubuntu安装VmTools
    CodeBlocks集成cppcheck
    自定义鼠标右键(层叠式菜单:cascading menu)
    Hao123这个流氓
    Android的ADT内容助手快捷方式设置
    安装Google框架服务并突破Google Play下载限制
    Windows7下CHM电子书打开不能正常显示内容
    谷歌首页背景设置
  • 原文地址:https://www.cnblogs.com/conswin/p/6741474.html
Copyright © 2011-2022 走看看