通过类的字节码文件对象获取构造方法并创建对象
package com.shujia.day21;
import java.lang.reflect.Constructor;
import java.util.Arrays;
/*
类中的三大成员:
成员变量:Field
构造方法:Constructor
成员方法:Method
获取构造方法,通过类的字节码文件对象进行获取
public Constructor<T> getConstructor(Class<?>... parameterTypes) 获取一个类中某一个公共的构造方法
getConstructors 获取类中所有公共的构造方法
getDeclaredConstructors 获取类中所有的构造方法,包括私有的
创建对象 通过获取的构造方法进行创建对象
newInstance()
con.newInstance(“zhangsan", 20);
反射获取构造方法并创建对象
调用私有的构造方法赋值需要先进行暴力访问 c3.setAccessible(true);
*/
public class StructureDemo1 {
public static void main(String[] args) throws Exception{
//如何通过反射获取一个类中的构造方法,并创建对象
//获取类的Class对象
Class<?> studentClass = Class.forName("com.shujia.day21.Student");
//public Constructor<T> getConstructor(Class<?>... parameterTypes) 获取一个类中某一个公共的构造方法
//获取一个类中无参的公共的构造方法
Constructor<?> c1 = studentClass.getConstructor(); // 无参的构造方法
System.out.println(c1);
//获取一个有一个参数是String类型的构造方法
Constructor<?> c2 = studentClass.getConstructor(String.class);
System.out.println(c2);
// Constructor<?> c3 = studentClass.getConstructor(String.class, int.class);
// System.out.println(c3);
//如何获取私有的构造方法
Constructor<?> c3 = studentClass.getDeclaredConstructor(String.class, int.class);
System.out.println(c3);
System.out.println("------------------------------------------------");
//getConstructors() 获取类中所有公共的构造方法
Constructor<?>[] cs = studentClass.getConstructors();
System.out.println(Arrays.toString(cs));
System.out.println("------------------------------------------------");
//获取类中所有的构造方法,包括私有的
Constructor<?>[] cs2 = studentClass.getDeclaredConstructors();
System.out.println(Arrays.toString(cs2));
System.out.println("------------------------------------------------");
//如何通过获取的构造方法进行创建对象
//newInstance(Object ... initargs)
Object o = c1.newInstance();
System.out.println(o);
System.out.println("------------------------------------------------");
Object o2 = c2.newInstance("魏一民");
System.out.println(o2);
System.out.println("------------------------------------------------");
c3.setAccessible(true); // 暴力访问
Object o3 = c3.newInstance("魏一民", 18);
System.out.println(o3);
}
}
类
package com.shujia.day21;
public class Student {
private String name;
int age;
protected String address;
public int phoneNum;
public Student() {
}
public Student(String s) {
System.out.println("带参数的公共构造方法" + s);
}
protected Student(int i) {
System.out.println("带参数的受保护构造方法" + i);
}
Student(double d) {
System.out.println("带参数的默认修饰符构造方法" + d);
}
private Student(String name, int age) {
System.out.println("带参数的私有构造方法" + name + "," + age);
}
public void fun1() {
System.out.println("这是公共的成员方法");
}
public String fun1(String s) {
System.out.println("这是公共的成员方法" + s);
return "数加:" + s;
}
protected void fun2(){
System.out.println("这是受保护的成员方法");
}
void fun3(){
System.out.println("这是默认的成员方法");
}
private void fun4(){
System.out.println("这是私有的成员方法");
}
@Override
public String toString() {
return "Student{" +
"name='" + name + '\'' +
", age=" + age +
", address='" + address + '\'' +
", phoneNum=" + phoneNum +
'}';
}
}