为什么公共构造函数无法通过反射访问

5

我感到困惑,当执行以下代码时:

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

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

1
你可以使用 getModifiers() 方法来确定访问级别/修饰符,而 isAccessible() 则有不同的目的。 - D3V
3个回答

7

可以使用getModifiers()方法来确定可访问性/修饰符,而isAccessible()则有不同的目的。

阅读java中Modifiers类的文档[链接]。该类拥有用于确定类成员可见性的必要方法。

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


6

-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


1
1- LinkedList有一个默认构造函数。 2- 这与问题有什么关系?? - MadProgrammer

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接