Java - 将私有类传递给方法

时间:2015-04-22 10:04:05

标签: java exception reflection parameters constructor

所以我有一个简洁的小函数,当我的函数不知道它们将要处理什么类时,我可以用它来构造对象。 (是的,在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;
    }
}

无论如何,我有一个在另一个类文件中声明的类,我希望主类能够传递给这个函数。

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吗?

2 个答案:

答案 0 :(得分:2)

如果FunctionsaClass(假设otherClassaClass位于同一文件中)位于同一个包中,则代码不会引发任何异常。 ITOH,如果这两个类不在同一个包中,则有一个例外:

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

otherClass的构造函数是public,可以通过反射找到,但类本身具有包私有可见性。这就是Functions#Construct(...)无法实例化它的原因。

如果您确实希望通过反射包私有类进行实例化,则可以使用javadoc中所述并由@Anuj

建议的setAccessibility(true)绕过访问安全性检查。
  

值true表示反射对象在使用时应禁止Java语言访问检查。

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;
    }
}

答案 1 :(得分:1)

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

sales_flat_quote_address