5

执行以下代码时,我很困惑:

@Test
public void testAccessible() throws NoSuchMethodException {
    Constructor<LinkedList> constructor = LinkedList.class.getConstructor();
    Assert.assertTrue(constructor.isAccessible());
}

断言失败,但 LinkedList 类具有public默认构造函数。那么为什么 isAccessible() 返回 false 呢?

4

3 回答 3

7

您可以使用getModifiers()方法来确定可访问性/修饰符,isAccessible()存在用于不同目的。

Modifiers浏览java中的类的文档。[链接 ]它具有确定类成员可见性所必需的方法。

isAccessible允许反射 API 在运行时访问任何成员。通过调用Field.setAcessible(true)您关闭此特定 Field 实例的访问检查,仅用于反射。现在,即使它是私有、受保护或包范围,您也可以访问它,即使调用者不属于这些范围。您仍然无法使用普通代码访问该字段。编译器不允许这样做。

于 2013-08-12T04:53:32.460 回答
6

Java 文档...

值为 false 表示反射对象应强制执行 Java 语言访问检查

isAccessible与 Java 的安全管理器有关,然后与它的公共可见性有关

Class#getConstructor(Class...)并且Class#getConstructors都只返回public构造函数

于 2013-08-12T04:38:14.683 回答
-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

于 2013-08-12T04:45:50.730 回答