Возможно, вы захотите попробовать использовать поле 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); }}
Со стандартным отражением нет, но есть библиотека, которая может сделать это за вас: objenesis .
Он специально предназначен для создания экземпляров классов без конструкторов по умолчанию и используется другими библиотеками сериализации, такими как xstream .
Примечание: конструктор может не вызываться в эти случаи (но это, по-видимому, то, что вы хотите).
Если ваш класс не имеет другого конструктора, тогда компилятор создаст его для вас. У вас может быть конструктор no-arg и не осознавать его.
Если вы не написали конструктор no-arg, и вы включили даже один конструктор , который принимает аргумент, тогда компилятор вам не даст. Отражение тоже не поможет: если вы попытаетесь найти конструктор no-arg и его нет, то чего вы ожидаете?
Не похоже, что вы можете использовать объект Java сериализация с использованием java.lang.Serializable, но это не ваш единственный выбор. Вы также можете использовать XML, или JSON, или прототипы буферов, или любой другой протокол, который удобен.
Проверьте это: посмотрите, работает ли вашObject.class.newInstace (). Если нет, то все, о чем я могу думать, это создать объект-прототип, вызвав обычный конструктор, установить его поля в ноль и затем клонировать его.
Ваше решение будет специфичным для 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:
Единственное решение, о котором я могу думать, это использовать библиотеку манипуляции байт-кода, такую как javassist , чтобы добавить конструктор по умолчанию.
Наличие экземпляра класса в качестве переменной clazz:
ReflectionFactory rf = ReflectionFactory.getReflectionFactory (); Конструктор objDef = parent.getDeclaredConstructor (); Конструктор intConstr = rf.newConstructorForSerialization (clazz, objDef); clazz.cast (intConstr.newInstance ());
, как описано в http://www.javaspecialists.eu/archive/Issue175.html