package bean;
public class Person {
private int age;
private String name;
public Person() {
super();
System.out.println("...Person run...");
}
public Person(String name, int age) {
super();
this.age = age;
this.name = name;
System.out.println("...Person param run..." + this.name + ":"
+ this.age);
}
public void show() {
System.out.println(name + "...show run..." + age);
}
public void method() {
System.out.println("...method run...");
}
public void paramMethod(String str, int num) {
System.out.println("...paramMethod..." + str + ":" + num);
}
public static void staticMethod() {
System.out.println("...staticMethod run...");
}
}
======================分割线==============================
/*
* 【获取Class中的构造函数】
*
* 由于Class类内就newInstance()一个方法能获取实例对象,且该对象对应的构造函数必须是空参,所以一般被反射的类都具备
* 空参构造函数,为了反射机制获取对象方便。
*/
package demo;
import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;
public class Demo {
public static void main(String[] args) throws ClassNotFoundException, InstantiationException, IllegalAccessException, NoSuchMethodException, SecurityException, IllegalArgumentException, InvocationTargetException {
creatNewObject();
creatNewObject_2();
}
public static void creatNewObject() throws ClassNotFoundException, InstantiationException, IllegalAccessException{
//先前新建Person类对象的方法
/*
* 早期new时候,先根据被new的类的名称找寻该类的字节码文件,并加载进内存,
* 并创建该字节码文件对象,接着创建该字节文件的对应的Person对象。
*/
bean.Person p = new bean.Person();//这里Person类与前一视频一样,可不重复记录到本子上
//如今新建Person类对象的方法步骤如下:
//1.明确需要被new的类的名称
String name = "bean.Person";
//2.找寻该名称类文件,并加载进内存,并产生Class对象。
Class clazz = Class.forName(name);
/*
* 3.利用Class类的特有方法创建该类对象:
* public T newInstance() throws InstantiationException,IllegalAccessException
* 创建此 Class 对象所表示的类的一个新实例。如同用一个带有一个空参数列表的 new 表达式实例化该类。如果该类尚未
* 初始化,则初始化这个类。(就是相当于平时Person p = new Person的功能)
*/
Object obj = clazz.newInstance();
//其实是用newInstance()方法去调用clazz内的空参构造函数Person()
/**
* (1)如果Person类内没有空参构造函数,那么会抛出InstantiationException,即初始化失败,因为newInstance()方法去clazz内
* 没找到空参构造函数;
*
* (2)如果Person类内的空参构造函数被private,那么会抛出IllegalAccessException,即无效访问异常,因为待访问的构造函数
* 被私有化,不能正常访问。
*/
}
public static void creatNewObject_2() throws ClassNotFoundException, NoSuchMethodException, SecurityException, InstantiationException, IllegalAccessException, IllegalArgumentException, InvocationTargetException{
//先前新建Person类对象的方法
bean.Person p = new bean.Person("小强",29);
/*
* 现在需求是,用反射机制new一个实参对象
*
* 【思路】如果指定参数29,表示要访问字节码文件中带有int参数的构造函数;如果指定参数“小强”和29,表示访问字节码
* 文件中同时带有String和int两个类型参数的构造函数。所以应该先获取对应的构造函数
*
*
*/
/**
* 打开API,点进java.lang,找到Class类,其内有特有方法:
*
* (1)public Constructor<?>[] getConstructors() throws SecurityException:获取该字节码文件中所有公共构造函数
*
* (2)public Constructor<?>[] getDeclaredConstructors() throws SecurityException
* 获取该字节码文件中所有构造函数,哪怕私有的也能获取
*
* (3)public Constructor<T> getConstructor(Class<?>... parameterTypes) throws NoSuchMethodException,SecurityException
* 获取带有指定参数的构造函数
*
* 【注】java.lang.reflect包中具备了反射机制涉及到的所有对象,封装在AccessibleObject中,其子类为Constructor(构造器),
* Field(字段), Method(方法)。
*/
//如今新建Person类对象的方法如下:
String name = "bean.Person";
Class clazz = Class.forName(name);
//获取到指定的构造函数对象
Constructor constructor = clazz.getConstructor(String.class,int.class);
//Constructor类中也有newInstance()方法,进行对象的初始化
Object obj = constructor.newInstance("小强",29);
}
}