Многие объяснения уже присутствуют, чтобы объяснить, как это происходит и как это исправить, но вы также должны следовать рекомендациям, чтобы избежать NullPointerException
вообще.
См. также: A хороший список лучших практик
Я бы добавил, очень важно, хорошо использовать модификатор final
. Использование "окончательной" модификатор, когда это применимо в Java
Сводка:
final
для обеспечения хорошей инициализации. @NotNull
и @Nullable
if("knownObject".equals(unknownObject)
valueOf()
поверх toString (). StringUtils
StringUtils.isEmpty(null)
. Я думаю, что Вы имеете дело с Несоответствием типов.
, Вероятно, на блок ссылаются в различных местах, или они компилируются против различных версий.
я предлагаю, чтобы Вы выполнили итерации через ConstructorInfo и сделали paramtype == typeof(DelayComposite)
на соответствующем параметре.
Я думал бы, что Ваш вызов должен будет быть:
var designer = Activator.CreateInstance(designerAttribute.Designer, new object[] { new DelayComposite(4) });
, Если, конечно, это не , что, в этом случае ответ не сразу очевиден.
Хотя я ненавижу подобную printf отладку...
public static void foo(Type t, params object[] p)
{
System.Diagnostics.Debug.WriteLine("<---- foo");
foreach(System.Reflection.ConstructorInfo ci in t.GetConstructors())
{
System.Diagnostics.Debug.WriteLine(t.FullName + ci.ToString());
}
foreach (object o in p)
{
System.Diagnostics.Debug.WriteLine("param:" + o.GetType().FullName);
}
System.Diagnostics.Debug.WriteLine("foo ---->");
}
// ...
foo(designerAttribute.Designer, new DelayComposite(4));
var designer = Activator.CreateInstance(designerAttribute.Designer, new DelayComposite(4));
, Что это печатает в окне вывода Visual Studio?
Если Вы хотите вызвать этого конструктора...
public DelayCompositeDesigner(DelayComposite CompositeObject)
... просто использование это:
var designer = Activator.CreateInstance(typeof(DelayCompositeDesigner), new DelayComposite(4));
или
var designer = Activator.CreateInstance<DelayCompositeDesigner>(new DelayComposite(4));
Я обнаружил другой способ создать экземпляр объекта, не вызывая конструктора вообще в то время как ответ другой вопрос на SF.
В Система. Время выполнения. Сериализация пространство имен там является функцией FormatterServices. GetUninitializedObject (тип) , который создаст объект, не вызывая конструктора.
при рассмотрении той функции в Отражателе Вы будете видеть, что это выполняет внешний вызов. Я не знаю, как черная магия на самом деле происходит под капотом. Но я действительно доказывал мне, что конструктора никогда не вызывали, но объект инстанцировали.
Можно использовать следующую перегрузку на CreateInstance:
public static Object CreateInstance(
Type type,
Object[] args
)
И в Вашем случае это было бы (я думаю):
var designer = Activator.CreateInstance(
typeof(DelayCompositeDesigner),
new object[] { new DelayComposite(4) }
);