Создание объекта (Java) [dубликат]

Возможно, вы захотите попробовать использовать поле DomainRole WMI. Значения 0 и 2 показывают автономную рабочую станцию ​​и автономный сервер соответственно.

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

  /// & lt; summary & gt;  /// Определяет, является ли локальная машина членом домена.  /// & lt; / summary & gt;  /// & lt; возвращает & gt; Булево значение, указывающее, является ли локальная машина членом домена. & lt; / returns & gt;  /// & lt; примечания & gt; http: //msdn.microsoft.com/en-gb/library/windows/desktop/aa394102 (v = vs.85) .aspx & lt; / remarks & gt;  public bool IsDomainMember () {ManagementObject ComputerSystem;  using (ComputerSystem = new ManagementObject (String.Format ("Win32_ComputerSystem.Name = '{0}'", Environment.MachineName))) {ComputerSystem.Get ();  UInt16 DomainRole = (UInt16) ComputerSystem ["DomainRole"];  return (DomainRole! = 0 & amp; DomainRole! = 2);  }}  
29
задан Vladimir 9 November 2010 в 13:37
поделиться

6 ответов

Со стандартным отражением нет, но есть библиотека, которая может сделать это за вас: objenesis .

Он специально предназначен для создания экземпляров классов без конструкторов по умолчанию и используется другими библиотеками сериализации, такими как xstream .

Примечание: конструктор может не вызываться в эти случаи (но это, по-видимому, то, что вы хотите).

25
ответ дан Brad Cupit 15 August 2018 в 23:29
поделиться
  • 1
    Вау! Какая злая часть кода! – Stephen C 9 November 2010 в 13:58
  • 2
    Я согласен - очень злой. Когда программист не создает никакого ctor, он / она ожидает, что никто его не называет, и - удивление! :-) – iirekm 9 November 2010 в 14:23
  • 3
    Но с другой стороны, "нормальный" отражение также нарушает правила дизайна классов (например, доступ к частным полям), но, по крайней мере, большинство программистов понимают, что такая вещь, как отражение, существует. Очень мало программистов знают об objensis. – iirekm 9 November 2010 в 14:25
  • 4
    Не особенно злой - очень полезно в реализации пользовательских схем сериализации, особенно когда исходный объект не реализован как сериализуемый. Для этой цели .NET имеет метод FormatterServices.GetUninitializedObject (). Я хочу, чтобы Java имела нечто похожее, которое было «официальным». – Wayne Citrin 24 June 2016 в 22:38
  • 5
    да не особо злой, но его можно использовать, чтобы сломать хотя бы одну из гарантий Java: jqno.nl/post/2015/02/28/hacking-java-enums – Jordan 28 August 2017 в 10:45

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

Если вы не написали конструктор no-arg, и вы включили даже один конструктор , который принимает аргумент, тогда компилятор вам не даст. Отражение тоже не поможет: если вы попытаетесь найти конструктор no-arg и его нет, то чего вы ожидаете?

Не похоже, что вы можете использовать объект Java сериализация с использованием java.lang.Serializable, но это не ваш единственный выбор. Вы также можете использовать XML, или JSON, или прототипы буферов, или любой другой протокол, который удобен.

2
ответ дан duffymo 15 August 2018 в 23:29
поделиться

Проверьте это: посмотрите, работает ли вашObject.class.newInstace (). Если нет, то все, о чем я могу думать, это создать объект-прототип, вызвав обычный конструктор, установить его поля в ноль и затем клонировать его.

-3
ответ дан Hannes de Jager 15 August 2018 в 23:29
поделиться

Ваше решение будет специфичным для JVM.

Если вам нужно портативное решение, используйте стороннюю библиотеку .

Для Sun JVM v1.5 вы может сделать это:

  final Class & lt;? & gt;  myClass = MyClass.class;  final ReflectionFactory reflection = ReflectionFactory.getReflectionFactory ();  final Constructor & lt; Object & gt;  constructor = reflection.newConstructorForSerialization (myClass, Object.class.getDeclaredConstructor (новый класс [0]));  final Object o = constructor.newInstance (новый объект [0]);  System.out.print (o.getClass ());   

Соответствующие классы в XStream:

  • com.thoughtworks.xstream.converters.reflection.PureJavaReflectionProvider
  • com.thoughtworks. xstream.core.JVM;
5
ответ дан johnstok 15 August 2018 в 23:29
поделиться

Единственное решение, о котором я могу думать, это использовать библиотеку манипуляции байт-кода, такую ​​как javassist , чтобы добавить конструктор по умолчанию.

3
ответ дан Maurice Perry 15 August 2018 в 23:29
поделиться
  • 1
    Почему нисходящий? Решение несколько сумасшедшее, но действительное. – Sean Patrick Floyd 9 November 2010 в 14:12
  • 2
    @seanizer Спасибо – Maurice Perry 9 November 2010 в 14:36

Наличие экземпляра класса в качестве переменной clazz:

  ReflectionFactory rf = ReflectionFactory.getReflectionFactory ();  Конструктор objDef = parent.getDeclaredConstructor ();  Конструктор intConstr = rf.newConstructorForSerialization (clazz, objDef);  clazz.cast (intConstr.newInstance ());   

, как описано в http://www.javaspecialists.eu/archive/Issue175.html

16
ответ дан mcveat 15 August 2018 в 23:29
поделиться
  • 1
    Ницца. У нас может быть победитель! (+1) – Sean Patrick Floyd 9 November 2010 в 14:01
  • 2
    Имейте в виду, что класс ReflectionFactory является классом Sun, поэтому он будет работать только на виртуальных машинах Sun / Oracle, и даже тогда он может быть изменен. – Francis Upton 22 December 2011 в 19:52
  • 3
    Откуда родительский ? – Raffi Khatchadourian 20 January 2017 в 21:45
Другие вопросы по тегам:

Похожие вопросы: