一、反射
1. 反射获取构造方法
在Java中,反射获取构造方法是实现动态创建对象的关键技术。它使程序能够在运行时:
- 动态加载未知类
- 突破私有访问限制(如私有构造方法)
- 实现框架级解耦(如Spring的Bean创建)
为什么需要反射获取构造方法的核心原因:让程序在运行时才知道要创建什么类,而不是在编译时就确定。


java
package com.lkbhua.MyreflectDemo2;
import java.lang.reflect.Constructor;
public class demo1 {
public static void main(String[] args) throws Exception {
/*
Class类中用于获取构造方法的方法:
Constructor<?>[] getConstructors() 返回所有公共构造方法对象的数组
Constructor<?> getDeclaredConstructor(Class<?>... parameterTypes) 返回所有构造方法对象的数组
Constructor<?> getConstructor(Class<?>... parameterTypes) 返回单个公共构造方法对象
Constructor<?> getDeclaredConstructor(Class<?>... parameterTypes) 返回单个构造方法对象
Constructor类中用于创建对象的方法:
T newInstance(Object... initargs) 根据指定的构造方法创建对象
setAccessible(boolean flag) 设置为true,表示取消访问检查
*/
// 1、获取class字节码文件对象
Class clazz = Class.forName("com.lkbhua.MyreflectDemo2.Student");
// 2、获取所有公共的构造方法
/*Constructor[] constructors = clazz.getConstructors();
for (Constructor c : constructors) {
System.out.println(c);
}
*/
// 3、获取所有构造方法
/*Constructor[] constructors2 = clazz.getDeclaredConstructors();
for (Constructor c : constructors2) {
System.out.println(c);
}
*/
// 4、获取单个公共的构造方法
/*Constructor c1 = clazz.getConstructor();
System.out.println(c1);
*/
// 5、获取单个构造方法
Constructor c2 = clazz.getDeclaredConstructor(String.class, int.class);
System.out.println(c2);
// 获得权限修饰符
int modifiers = c2.getModifiers();
// 表示临时取消权限校验
// 即: 暴力反射
c2.setAccessible(true);
Student s = (Student) c2.newInstance("lkbhua", 18);
}
}
java
package com.lkbhua.MyreflectDemo2;
public class Student {
private String name;
private int age;
public Student() {}
public Student(String name, int age) {
this.name = name;
this.age = age;
}
public void setName(String name) {
this.name = name;
}
public String getName() {
return name;
}
public void setAge(int age) {
this.age = age;
}
public int getAge() {
return age;
}
@Override
public String toString() {
return "Student [name=" + name + ", age=" + age + "]";
}
}