执行以下代码时我很困惑:
@Test
public void testAccessible() throws NoSuchMethodException {
Constructor<LinkedList> constructor = LinkedList.class.getConstructor();
Assert.assertTrue(constructor.isAccessible());
}
断言失败,但LinkedList类有public
默认构造函数。那么为什么isAccessible()返回false?
答案 0 :(得分:6)
来自Java Docs ...
值false表示反射对象应强制执行Java语言访问检查
isAccessible
更多地与Java的安全管理器有关,然后与它的公共可见性有关
Class#getConstructor(Class...)
和Class#getConstructors
都只返回public
构造函数
答案 1 :(得分:5)
您可以使用getModifiers()
方法来确定辅助功能/修饰符,isAccessible()
用于不同目的。
浏览java中Modifiers
类的文档。 [Link]它具有确定类成员可见性所必需的方法。
isAccessible
允许反射API在运行时访问任何成员。通过调用Field.setAcessible(true)
,您可以关闭此特定Field实例的访问检查,仅用于反射。现在您可以访问它,即使它是私有,受保护或包范围,即使调用者不属于这些范围。您仍然无法使用普通代码访问该字段。编译器不允许它。
答案 2 :(得分:-2)
Declaration
public Constructor<T> getConstructor(Class<?>... parameterTypes) throws NoSuchMethodException, SecurityException
将您的类对象作为参数数组传递,如下所示。
Example :
package com.tutorialspoint;
import java.lang.reflect.*;
public class ClassDemo {
public static void main(String[] args) {
try {
// returns the Constructor object of the public constructor
Class cls[] = new Class[] { String.class };
Constructor c = String.class.getConstructor(cls);
System.out.println(c);
}
catch(Exception e) {
System.out.println(e);
}
} }
http://www.tutorialspoint.com/java/lang/class_getconstructor.htm