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(对象,方法的参数);

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

原文地址:https://www.cnblogs.com/hesi/p/6089271.html