Следует отметить две вещи:
Оператор import
не влияет на поведение класса во время выполнения. Никакой код не генерируется для оператора импорта. И если вы просто импортируете класс A в класс B, то загрузка класса B не приводит к загрузке класса A.
Время загрузки класса и время инициализации класса различаются.
Жизненный цикл класса заключается в том, что он загружается, связывается и инициализируется перед использованием (см. Глава 12 JLS ).
Загрузка выполняется загрузчиком классов и включает в себя поиск файла класса, чтение его в byte[]
и вызов ClassLoader::defineClass
.
Связывание выполняется с помощью основного кода JVM и состоит из проверки, подготовки и разрешения символических ссылок. В JLS 12.3 говорится следующее:
Эта спецификация обеспечивает гибкость реализации в отношении того, когда происходит связывание действий (и, из-за рекурсии, загрузки), при условии, что семантика Язык программирования Java соблюдается, что класс или интерфейс полностью проверены и подготовлены перед его инициализацией, и что ошибки, обнаруженные во время связывания, генерируются в той точке программы, где программа предпринимает некоторые действия, которые могут потребовать связи с классом. или интерфейс, связанный с ошибкой.
blockquote>Это означает, что мы не можем определиться с тем, когда выполняются различные задачи.
Инициализация происходит после того, как все соответствующие классы были связаны. В соответствии с JLS 12.4.1 :
Класс T или интерфейсный тип T будут инициализированы непосредственно перед первым появлением любого из следующего:
[ 1145] T является классом, и создается экземпляр T.
blockquote>- Вызывается статический метод, объявленный T.
- Статическое поле, объявленное T, присваивается.
- Используется статическое поле, объявленное T, и поле не является постоянной переменной (§4.12.4).
Согласно JLS (см. Выше), мы не можем точно сказать, когда B
будет загружен и связан. Все, что мы можем сказать, это то, что это происходит до инициализации B
... если она инициализирована. (Вы можете получить представление о порядке загрузки классов, включив некоторые журналы JVM. Однако, порядок может варьироваться в зависимости от поставщика и версии JVM.)
В соответствии с инициализацией JLS (см. Выше) [115 ] будет происходить (обычно), когда первый экземпляр B
создается вашим методом main
. Предполагая, что object
в вашем Вопросе было инициализировано для экземпляра B
, инициализация уже произошла до теста instanceof
. Если нет, то B
не будет инициализирован тестом instanceof
.
На первый взгляд, нет необходимости загружать класс A
. (Это зависит от того, действительно ли и как класс B
использует класс A
, и от того, как / как другие части вашей кодовой базы используют A
.)
Я знаю, что это давно, но я нашел это полезным
, попробуйте это:
IF EXISTS (SELECT * from syscolumns where id = Object_ID(@TABLE_NAME) and colstat & 1 = 1)
BEGIN
-- Do your things
END
IF (OBJECTPROPERTY(OBJECT_ID('TABLE_NAME'), 'TableHasIdentity') = 1)
ObjectProperty
доступен начиная с SQL Server 2008 Ссылка: OBJECTPROPERTY
Один из способов сделать это - использовать хранимую процедуру sp_help
. I.e:
sp_help MyTable
Это вернет DataSet, в котором есть вся необходимая информация на столе. Существует конкретная таблица, в которой есть информация о личности.
Т.е.:
Если оно не содержит поле идентификатора, столбец Идентичности скажет: «Столбец идентификации не определен».
Это запрос, который возвращает имя столбца identity;
create procedure GetIdentity
@tablename varchar(50)
begin
SELECT OBJECT_NAME(OBJECT_ID) AS TABLENAME,
NAME AS COLUMNNAME,
SEED_VALUE,
INCREMENT_VALUE,
LAST_VALUE,
IS_NOT_FOR_REPLICATION
FROM SYS.IDENTITY_COLUMNS
WHERE OBJECT_NAME(OBJECT_ID) = @tablename
end
Затем сформируйте код.
Вызовите эту хранимую процедуру, используя роль datareader, затем проверьте datareader.hasrows()
. Если значение условия истинно (1
), то таблица имеет столбец identity, если он установлен. Если нет, то столбец идентичности отсутствует.