如果确定该类不能被实例化,应当在私有构造方法中,增加AssertionError
throw new AssertionError("No java.util.Objects instances for you!");
Java反射可以修改方法的访问权限,如果不抛出错误,使用Constructor.newInstance()方法仍可以实例化。
public class ClassPrivate {
@Test
public void test() {
try {
Class<?> clazz = Class.forName("java.util.Objects");
Constructor<?> constructor = clazz.getDeclaredConstructor();// 获取构造方法
constructor.setAccessible(true); // 修改private权限。true表示可以访问私有方法
Objects objects = (Objects) constructor.newInstance();
} catch (Exception e) {
e.printStackTrace();
}
}
}
setAccessible()方法作用
使用Java反射,常常需要反射修改类的私有属性,这个时候就需要调用setAccessible(true)
方法,否则程序会抛出IllegalAccessException
。
其作用原理并不是将私有属性改为其他可见范围,而是使这个属性跳过Java的安全检查。