所以我有一个简洁的小函数,当我的函数不知道它们将要处理什么类时,我可以用它来构造对象。 (是的,在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吗?
答案 0 :(得分:2)
如果Functions
和aClass
(假设otherClass
与aClass
位于同一文件中)位于同一个包中,则代码不会引发任何异常。 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