数据bean:
package com.mth.bean;
public class Person {
private String name;
private int age;
private Person(String name, int age) {
super();
this.name = name;
this.age = age;
}
public Person() {
super();
System.out.println("空参构造方法");
}
public Person(int x) {
super();
System.out.println("int 参数的构造方法!"+x);
}
public void say() {
System.out.println("public.............say");
}
public void run() {
System.out.println("public..........run");
}
private void think() {
System.out.println("private.......think");
}
@Override
public String toString() {
return name + "......" + age;
}
}
三种获取class文件对象的方式:
package com.mth.test;
import com.mth.bean.Person;
/*
* 获取person.class字节文件对象
*
* */
public class ReflectDemo {
public static void main(String[] args) {
// 第一种方法:通过对象获取
Person p = new Person();
Class c1 = p.getClass();
System.out.println(c1);
// 第二种方法:通过类的静态属性来获取
Class c2 = Person.class;
System.out.println(c2);
System.out.println(c1 == c2);// true
System.out.println(c1.equals(c2));// true
// 第三种方法:通过Class类的静态方法 forName
// "Person" 如果定义了包名 包名.类名
try {
Class c3 = Class.forName("com.mth.bean.Person");
System.out.println(c3);
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
从字节码文件对象中获取构造方法,并运行 步骤:
A 获取字节码文件对象
B 通过字节码文件对象,获取构造方法
getConstructors()返回数组,所有的公共的
getDeclaredConstructors()返回数组,所有的,包含私有的
getConstructor()返回一个构造,公共的
getConstructor(可变参数)
getDeclaredConstructor()返回一个,私有的
C 通过newInstance()方法,建立对象
package com.mth.test;
import java.lang.reflect.Constructor;
import com.mth.bean.Person;
/*
* 获取构造方法 并运行
*
* */
public class ReflectDemo1 {
public static void main(String[] args) throws ClassNotFoundException,
Exception, Exception {
Class clazz = Class.forName("com.mth.bean.Person");
// Constructor<?>[] getConstructors() 返回一个包含某些 Constructor 对象的数组
// 反映此 Class 对象所表示的类的所有公共(public)构造方法。
// 获取到的都是公有的构造方法
Constructor[] array = clazz.getConstructors();
for (Constructor c : array) {
System.out.println(c);
}
// getDeclaredConstructors() 获取当前类的所有构造方法
Constructor[] array1 = clazz.getDeclaredConstructors();
for (Constructor c : array1) {
System.out.println(c);
}
// 获取空参数的一个构造方法
// getConstructor() 获取一个构造方法 (只能通过参数列表来区分)
Constructor con = clazz.getConstructor();
System.out.println("只获取空参构造....." + con);
// 如何运行构造方法呢?
// 创建实例
Person p1 = (Person) con.newInstance();
System.out.println(p1);// 结果null......0
// 获取int参数的构造函数getConstructor(参数..类)
Constructor con1 = clazz.getConstructor(int.class);
System.out.println("获取int参数的构造函数....." + con1);
con1.newInstance(19);
// 获取私有的构造方法 并运行
// getDeclaredConstructor()获取私有的构造
Constructor con2 = clazz
.getDeclaredConstructor(String.class, int.class);
System.out.println(con2);
// 如何运行呢?
// Constructor 父类AccessibleObject当中 void setAccessible(boolean flag) 方法
con2.setAccessible(true);
Person p2 = (Person) con2.newInstance("zhangsan", 20);
System.out.println(p2);
// 不获取构造方法直接创建对象
// T newInstance() 创建此 Class 对象所表示的类的一个新实例。
// 适合有空参构造 并且权限是public的可以直接通过newInstance()创建对象
Class clazz2 = Class.forName("com.mth.bean.Person");
Person p3 = (Person) clazz2.newInstance();
System.out.println("直接创建对象 不通过构造..." + p3);
}
}