您的位置:首页 > 编程语言 > Java开发

反射机制——获取Class中的构造函数

2018-01-23 00:00 267 查看

一、通过反射实例化无参对象

/***
* * @Title: createNewObject
* @Description: 反射实例化无参对象
* @param
* @throws
* Exception
* @return void
* @throws
*/
public static void createNewObject() throws Exception {
// 早期:
// new 的时候,先根据被new的类的名称寻找该类的字节码文件,加载至内存,
// 并创建该字节码文件对象,然后创建该字节码文件对应的Person对象。
// com.lh.reflection.bean.Person p = new
// com.lh.reflection.bean.Person();

// 现在:
String name = "com.lh.reflection.bean.Person";

// 寻找该类名称字节码文件 ,并加载至内存,生成Class对象
Class<Person> clazz = (Class<Person>) Class.forName(name);
// 如何产生该类的对象呢?
// 相当于调用Person类中的无参构造方法
Person person = clazz.newInstance();
}


二、通过反射实例化有参对象

/**
* @throws Exception *
* @Title: createNewObject2
* @Description:
* 反射实例化有参对象
* @param
* @return void
* @throws
*/
private static void createNewObject2() throws Exception {
//		com.lh.reflection.bean.Person p = new com.lh.reflection.bean.Person("小明", 20);

/***
* 当获取指定名称对应类中所体现的对象时,而该对象初始化不使用空参构造函数怎么办呢?
* 既然是通过指定的构造函数进行对象的初始化,所以应该先获取该构造函数,通过字节码文件对象即可完成。
* 该方法是getConstructor(Class<T>.. paramsType)
*
*/
String name = "com.lh.reflection.bean.Person";

// 寻找该类名称字节码文件 ,并加载至内存,生成Class对象
Class<Person> clazz = (Class<Person>) Class.forName(name);

// 获取指定的构造器对象
Constructor<Person> constructor = clazz.getConstructor(String.class, int.class);

// 通过构造器Constructor类中的newInstance()方法进行初始化
Person person = constructor.newInstance("小明", 20);

}


三、Person类

/**
* @Title: Person.java
* @Package com.lh.reflection.bean
* @Description: TODO
* @author Liu
* @date 2018年1月23日 下午3:06:10
* @version V1.0
*/
package com.lh.reflection.bean;

/**
* @ClassName: Person
* @Description: Person实体类
* @author Liu
* @date 2018年1月23日 下午3:06:10
*
*/
public class Person {
private int age;
private String name;

public Person() {
System.out.println("constructor no param run...");
}

public Person(String name,int age) {
this.age = age;
this.name = name;

System.out.println("constructor with param run..." + this.name + ":" + this.age);
}

public void show() {
System.out.println(name + "...show run..." + age);
}

private void method() {
System.out.println("method run");
}

public void paramMethod(String str, int num) {
System.out.println("paramMethod run..." + str + ":" + num);
}

public static void staticMethod() {
System.out.println("static method run...");
}

}


四、关键点

1、无参实例化只需要调用class对象的newInstance()方法即可。

2、有参实例化需要先通过getConstructor(Class<T>.. paramTypes)获取指定Constructor构造器对象,然后调用newInstance(Object.. objs)方法即可。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息