2015-04-22 5 views
-1

Итак, у меня есть аккуратная небольшая функция, которую я могу использовать для построения объектов, когда мои функции не знают, с какими классами они будут иметь дело. (Да, у меня есть некоторые хорошие использует для этого, прежде чем Soritos или кто-то еще хочет сказать мне, что я нелогично)Java - передать частный класс методу

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 не отображается для моей функции-конструктора вне этого класса?

+1

Помимо каких-либо комментариев по качеству деревенщина-Goldberg этого кода, вы, вероятно, хотите разместить трассировки стека первым. – Mena

+0

Что смешно в моем коде? Это упрощенный пример моей проблемы. Ну, это то, что он ловит исключение, поэтому я не уверен, что его вызывает. – TheOnlyWAR10CK93

+0

Использовать отладчик? Используйте правильную обработку 'Exception' вместо вашего подавления? Здесь мало что можно ответить, если вы не опубликуете всю проблему, а не только какой-то свалку кода. – Mena

ответ

2

Если Functions и aClass (при условии, otherClass находится в том же файле aClass) находятся в том же пакете, что ваш код не вызывает каких-либо исключений. Ито, если эти 2 класса не в том же пакете, есть исключение:

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

Конструктор otherClass является public и обнаруживается путем отражения, а сам класс имеет пакет частного видимость. Вот почему Functions#Construct(...) не может создать экземпляр.

Если вы действительно хотите создать экземпляр через пакет отражения частных классов, вы можете обойти проверку безопасности доступа с setAccessibility(true), как описано в javadoc и предложил @Anuj

Значение верно указывает на то, что отраженный объект должен подавлять проверку доступа к языку 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; 
    } 
} 
+0

Спасибо. Не осознавали, что эти вещи были побочными – TheOnlyWAR10CK93

1

Если ваш контекст не использует диспетчера безопасности, вы можете попытаться сделать конструктор доступным путем отражения.

con.setAccessible(true); 
Смежные вопросы