[英]Java - Pass private class to a method
因此,我有一個簡潔的小函數,當我的函數不知道它們將要處理什么類時,可以使用它來構造對象。 (是的,在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在此類之外對我的構造函數不可見嗎?
如果Functions
和aClass
(假設otherClass
是在同一個文件aClass
)都在同一個包,你的代碼不會引發任何異常。 ITOH,如果這兩個類不在同一包中,則有一個例外:
java.lang.IllegalAccessException: Class pack1.Functions can not access a member of class pack2.otherClass with modifiers "public"
otherClass
的構造otherClass
是public
,可以通過反射找到,但是該類本身具有包的私有可見性。 這就是為什么Functions#Construct(...)
無法實例化它的原因。
如果您確實想通過反射包私有類實例化,則可以使用setAccessibility(true)
繞過訪問安全性檢查,如javadoc中所述,並由@Anuj建議
值為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;
}
}
如果上下文不使用安全管理器,則可以嘗試通過反射使構造函數可訪問。
con.setAccessible(true);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.