优雅的使用AssertionError

Posted by KANG's BLOG on Tuesday, May 18, 2021

如果确定该类不能被实例化,应当在私有构造方法中,增加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的安全检查。