zoukankan      html  css  js  c++  java
  • Java之类的构造器(反射)

    反射:

    Java反射机制:指的是在Java程序运行状态中,对于任何一个类,都可以获得这个类的所有属性和方法;对于给定的一个对象,都能够调用它的任意一个属性和方法。这种动态获取类的内容以及动态调用对象的方法称为反射机制。Java的反射机制允许在对类未知的情况下,获取类相关信息的方式变得更加多样灵活,调用类中相应方法,是Java增加其灵活性与动态性的一种机制。

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

      1. 在运行时判断任意一个对象所属的类;
      2. 在运行时构造任意一个类的对象;
      3. 在运行时判断任意一个类所具有的成员变量和方法;
      4. 在运行时调用任意一个对象的方法。

    Class类中存在以下几个重要的方法:

      • getName():

    一个Class对象描述了一个特定类的特定属性,而这个方法就是返回String形式的该类的简要描述。

      • newInstance()

    该方法可以根据某个Class对象产生其对应类的实例。需要强调的是,它调用的是此类的默认构造方法。

      • getClassLoader()

    返回该Class对象对应的类的类加载器。

      • .getComponentType()

    该方法针对数组对象的Class对象,可以得到该数组的组成元素所对应对象的Class对象。例如:

    int[] ints = new int[]{1,2,3};

    Class class1 = ints.getClass();

    Class class2 = class1.getComponentType();

    而这里得到的class2对象所对应的就应该是int这个基本类型的Class对象。

      • getSuperClass()

    返回某子类所对应的直接父类所对应的Class对象。

      • isArray()

    判定此Class对象所对应的是否是一个数组对象。

    小实例:

    运行时输入类名创建对象,然后输入方法名,该对象调用该方法;

      1. 利用Scanner来获取输入的类的名字

    注意:要调用的类写在包内的话,输入时的格式为:包名.类名

    Scanner sc = new Scanner(System.in);
    
    System.out.println("请输入类名:");
    
    String classname = sc.nextLine();// 获取类名;
    

    2..根据获取到的类名,创建类( 调用Class.forName(className)方法),该过程会抛出一个没有找到类的一个异常;

    		Class c;
    //要调用的类class写在包内的话,要加上包.类;
    		try {
    			c = Class.forName(classname);
    		} catch (ClassNotFoundException e1) {
    			// TODO Auto-generated catch block
    			e1.printStackTrace();
    		}

    3.根据我们创建的类,创建构造器(调用getConstructo()方法);

    Constructor con = c.getConstructor(int.class);

    getConstructor方法里面需要的参数类型,是你要调用的构造方法的参数类型。如果是String型的参数的话,那么该方法写的就是 c.getConstructor(String.class)

    4. 获取要传给需要调用的构造方法的参数值

    System.out.println("请输入构造的参数");
    String cna=sc.nextLine();

    5.根据构造器创建对象;

    Object o=con.newInstance(Integer.parseInt(cna));
    //Integer.parseInt(cna),把string类型的数据,转换为int型

    6.对象创建好之后,就可以调用方法了,首先是输入我们的方法名

    System.out.println("请输入方法名:");		
    String name = sc.nextLine();// 获取输入的方法名;

    7.得到方法名之后,获取方法。

    Method me=c.getMethod(name, int.class);//getMethod(方法名, 方法的参数类型)

    8.在对象上面调用方法;

    me.invoke(o,14);//me.invoke(对象,方法的参数);
    

    这样一个动态绑定的过程就完成了。当然这个过程会有很多的异常需要抛出。

  • 相关阅读:
    1-7周成绩总结
    1-6周成绩总结
    第七周学习笔记
    前五周测验成绩总结
    第六周学习笔记
    第五周学习笔记
    2018-2019-2 20189206 Python3学习
    2018-2019-2 20189206 安全工具的学习
    2018-2019-2 20189206 《网络攻防实践》 第一周作业
    2018-2019-1 20189206 《Linux内核原理与分析》第九周作业
  • 原文地址:https://www.cnblogs.com/hesi/p/6089271.html
Copyright © 2011-2022 走看看