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);
        }

    }

}
时间: 2024-10-12 00:19:08

java的泛型与反射机制的相关文章

java工厂类与反射机制

java 简单工厂类 2012-04-22 15:44:07|  分类: java |  标签:java工厂类  简单工厂类  |举报|字号 订阅 简单工厂模式需要由以下角色组成: 接口                        接口的实现类(简单工厂模式里面的具体产品角色)                        工厂注意对比以下三个实例的不同实例1: package org.jzkangta.factorydemo01;//定义接口interface Car{    public 

Java 核心类库之反射机制

1:什么是反射机制? 2:反射机制它可以做什么呢? 3:反射机制对应的API又是什么? 1):通过反射机制来获取一个对象的全限定名称(完整包名),和类名: 2):实例化Class对象 3):获取对象的父类与实现的接口 4):获取类中的所有的方法或者单个方法 5):使用反射调用方法 && 使用反射调用静态方法 6):使用反射调用数组参数 7):使用反射,动态拷贝数组 7):获取一个类中所有的构造器,获取单个不带参数的构造器,获取带参数的构造器 8):使用反射调用构造器---->创建对象

Java Demo 学习 理解 反射机制 (基础学习)

目录 反射机制是什么 反射机制能做什么 反射机制的相关API ·通过一个对象获得完整的包名和类名 ·实例化Class类对象 ·获取一个对象的父类与实现的接口 ·获取某个类中的全部构造函数 - 详见下例 ·通过反射机制实例化一个类的对象 ·获取某个类的全部属性 ·获取某个类的全部方法 ·通过反射机制调用某个类的方法 ·通过反射机制操作某个类的属性 ·反射机制的动态代理 反射机制的应用实例 ·在泛型为Integer的ArrayList中存放一个String类型的对象. ·通过反射取得并修改数组的信息

Java进阶之reflection(反射机制)——反射概念与基础

反射机制是Java动态性之一,而说到动态性首先得了解动态语言.那么何为动态语言? 一.动态语言 动态语言,是指程序在运行时可以改变其结构:新的函数可以引进,已有的函数可以被删除等结构上的变化.比如常见的JavaScript就是动态语言,除此之外Ruby,Python等也属于动态语言,而C.C++则不属于动态语言. 二.Java是动态语言吗? 从动态语言能在运行时改变程序结构结构或则变量类型上看,Java和C.C++一样都不属于动态语言. 但是JAVA却又一个非常突出的与动态相关的机制:反射机制.

java.lang.Class&lt;T&gt; -- 反射机制

1反射机制是什么 反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意一个方法和属性:这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制. 2反射机制能做什么 反射机制主要提供了以下功能: 在运行时判断任意一个对象所属的类: 在运行时构造任意一个类的对象: 在运行时判断任意一个类所具有的成员变量和方法: 在运行时调用任意一个对象的方法: 生成动态代理. 3反射机制的相关API 通过一个对象获得完整的包名和类名 pac

Java学习之:反射机制

一.反射机制应用场景 知道在哪里用的情况很重要,任何东西的产生都有他的来由,知道了场景才知道为什么要发明这个东西. 一般在开发针对java语言相关的开发工具和框架时使用,比如根据某个类的函数名字,然后执行函数,实现类的动态调用! 而且这么看,所有面向对象的语言可能都会用到这个机制,西草原生并不支持这种机制,但是可以手动实现,详情请见好基友的文章,http://blog.csdn.net/k346k346/article/details/51698184 二.反射机制 言归正传,来具体说说什么是反

Java中的动态反射机制和动态代理

一.什么是反射机制? 在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意一个方法和属性:这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制.简单来说,就是Java对每一个类和类中的所有成员都进行了封装,这样每个类都有一个与之对应的Class对象,通过这个对象可以直接访问类中的所有成员. 二.Class类 1.在一个Class类中,将被封装类的方法(构造器之外)封装为Method类,将字段封装为Filed类,将构造器封装为Co

【Java基础】java类加载过程与反射机制

1.类的加载.连接和初始化 当程序使用某个类时,如果该类还未被加载到内存中,则系统会通过加载.连接.初始化三个步骤来对类进行初始化.如果没有意外,jvm将会连续完成这三个步骤,有时也把这三个步骤统称为类的加载和类初始化. 1.1 类的加载 类加载指的是将类的class文件读入内存,并且为之创建一个java.lang.Class对象,也就是说当程序中使用任何类时,都会为之创建一个java.lang.Class对象.类的加载由类加载器完成,类加载器通常由JVM提供,这些类加载器是前面所有程序运行的基

java的RTTI和反射机制

RTTI,即Run-Time Type Identification,运行时类型识别.它假定我们在编译时已经知道了所有的类型.那么在运行时就能够自动识别每个类型. 很多时候需要进行向上转型,比如Base类派生出Derived类,但是现有的方法只需要将Base对象作为参数,实际传入的则是其派生类的引用.那么RTTI就在此时起到了作用,比如通过RTTI能识别出Derive类是Base的派生类,这样就能够向上转型为Derived.类似的,在用接口作为参数时,向上转型更为常用,RTTI此时能够判断是否可