目录
获取类的构造器
获取类的构造器、并对其进行操作
代码实例一
代码实例二
获取类构造器的作用
代码示例三
获取类的构造器
获取类的构造器、并对其进行操作
- Class提供了从类中获取构造器的方法。
方法 | 说明 |
---|---|
Constructor<?>[] getConstructors() | 获取全部构造器(只能获取public修饰的) |
Constructor<?>[] getDeclaredconstructors() | 获取全部构造器(只要存在就能拿到) |
Constructor<T> getConstructor(Class<?>... parameterTypes) | 获取某个构造器(只能获取public修饰的) |
Constructor<T> getDeclaredconstructor(class<?>...parameterTypes) | 获取某个构造器(只要存在就能拿到) |
代码实例一
- 先定义一个Cat类
public class Cat {
private String name;
private int age;
public Cat() {
}
public Cat(String name, int age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
- 获取所有构造器并遍历,输出构造器的参数个数
import org.junit.Test;
import java.lang.reflect.Constructor;
public class Test2Constructor {
@Test
public void testGetConstructors(){
//1.反射第一步:必须得到这个类的Class对象
Class c = Cat.class;
//2.获取类的全部构造器
Constructor[] constructors = c.getConstructors();
//3.遍历数组中的每个构造器
for (Constructor constructor : constructors) {
System.out.println(constructor.getName() + "---->" +
constructor.getParameterCount());
}
}
}
运行测试结果:
但是这个方法只能获取public修饰的,无法获取私有的构造器;
如果想要获取所有的构造器,应该使用:
代码实例二
import org.junit.Test;
import java.lang.reflect.Constructor;
public class Test2Constructor {
@Test
public void testGetConstructors() throws Exception {
//1.反射第一步:必须得到这个类的Class对象
Class c = Cat.class;
//2.获取某个构造器:无参构造器
Constructor constructor = c.getDeclaredConstructor();
System.out.println(constructor.getName() + "---->" +
constructor.getParameterCount());
//3.获取某个构造器:有参构造器
Constructor constructor2 = c.getDeclaredConstructor(String.class,int.class);
System.out.println(constructor2.getName() + "---->" +
constructor2.getParameterCount());
}
}
运行结果:
获取类构造器的作用
- 依然是初始化对象返回
Constructor提供的方法 | 说明 |
---|---|
T newInstance(Object... initargs) | 调用此构造器对象表示的构造器,并传入参数,完成对象的初始化并返回 |
public void setAccessible(boolean flag) | 设置为true,表示禁止检查访问控制(暴力反射) |
代码示例三
这样直接运行会报错,无法访问私有的构造器。
使用暴力反射:
import org.junit.Test;
import java.lang.reflect.Constructor;
public class Test2Constructor {
@Test
public void testGetConstructors() throws Exception {
//1.反射第一步:必须得到这个类的Class对象
Class c = Cat.class;
//2.获取某个构造器:无参构造器
Constructor constructor = c.getDeclaredConstructor();
System.out.println(constructor.getName() + "---->" +
constructor.getParameterCount());
constructor.setAccessible(true); //禁止检查访问权限
Cat cat1 = (Cat) constructor.newInstance();
System.out.println(cat1);
//3.获取某个构造器:有参构造器
Constructor constructor2 = c.getDeclaredConstructor(String.class,int.class);
System.out.println(constructor2.getName() + "---->" +
constructor2.getParameterCount());
constructor2.setAccessible(true); //禁止检查访问权限
Cat cat2 = (Cat) constructor2.newInstance("叮当猫",3);
System.out.println(cat2);
}
}
运行结果:
END
学习自:黑马程序员——Java课程