Java - 将私有 class 传递给方法

Java - Pass private class to a method

所以我有一个简洁的小函数,当我的函数不知道它们要处理什么时,我可以用它来构造对象。classes。 (是的,在 Soritos 或其他任何人想告诉我我不合逻辑之前,我确实有一些很好的用途)

public static Object Construct(Class type, Class[] params, Object[] values){
    //Create an object of any class
    try{
       Constructor con = type.getConstructor(params);
       Object o = con.newInstance(values);
       return o;
    }
    catch(Exception e){
       System.out.println("CONSTRUCTOR EXCEPTION"); 
       return null;
    }
}

无论如何,我在另一个 class 文件中声明了一个 class,我希望主 class 能够传递给此函数。

public class aClass {
   public aClass(String S, String s){
      Class c = otherClass.class;
      Object o = Functions.Construct(c, new Class[]{String.class, String.class}, new Object[]{S, s});
   }    
}

class otherClass{   
    public otherClass(String arg1, String arg2){}
}

但是我得到了一个例外。这是因为 otherClass 在这个 class 之外对我的构造函数不可见吗?

如果您的上下文不使用安全管理器,您可以尝试通过反射访问构造函数。

con.setAccessible(true);

如果 FunctionsaClass(假设 otherClassaClass 在同一个文件中)在同一个包中,您的代码不会引发任何异常。 ITOH,如果这2个class不在同一个包里,就会有例外:

java.lang.IllegalAccessException: Class pack1.Functions can not access a member of class pack2.otherClass with modifiers "public"

otherClass的构造函数是public,是通过反射找到的,但是class本身有package private可见性。这就是为什么 Functions#Construct(...) 不能实例化它。

如果你真的想通过反射包私有 classes 实例化,你可以使用 setAccessibility(true) 绕过访问安全检查,如 javadoc 中所述和@Anuj[ 所建议的=22=]

A value of true indicates that the reflected object should suppress Java language access checking when it is used.

public static Object Construct(Class type, Class[] params, Object[] values){
    //Create an object of any class
    try{
       Constructor con = type.getConstructor(params);
       con.setAccessible(true);
       Object o = con.newInstance(values);
       return o;
    }
    catch(Exception e){
       System.out.println("CONSTRUCTOR EXCEPTION"); 
       return null;
    }
}