Каковы сходства и различия между Аннотациями Java и Атрибутами C#?

Измените свое регулярное выражение на:

^(?=.*[A-Z])(?=.*[a-z])(?=.*\d)[A-Za-z\d@$!%*#?&]{6,}$

, не забывая флаг g.

  • При использовании: (?=.*[A-Za-z]) оно пройдет, если пользователь введет только заглавные или строчные буквы.

  • При использовании: (?=.*[@$!%*#?&]) требуется, чтобы пользователь вводил какой-то специальный символ.

    var pass = 'TestString123'; 
    // Minimum six characters, at least one uppercase letter, one lowercase letter and one number
    var reg = new RegExp(/^(?=.*[A-Z])(?=.*[a-z])(?=.*\d)[A-Za-z\d@$!%*#?&]{6,}$/g);
    if (reg.test(pass)) {
        alert(1);
    } else {
        alert(2);
    }

46
задан Jared 15 January 2013 в 20:59
поделиться

4 ответа

Управление, когда Ваши метаданные сделаны доступными, отличается между этими двумя языками.

Java обеспечивает java.lang.annotation. Хранение аннотация и java.lang.annotation. Перечисление RetentionPolicy для управления, когда метаданные аннотации доступны. Выбор варьируется от Runtime (наиболее распространенный - метаданные аннотации, сохраненные в файлах класса), к Source (метаданные, отброшенные компилятором). Вы отмечаете свой пользовательский интерфейс аннотации с этим - например:

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.CLASS)
public @interface TraceLogging {
  // etc
}

позволил бы Вам размышлять над своим пользовательским TraceLogging аннотация во времени выполнения.

C# использует атрибут ConditionalAttribute , который управляется от символов времени компиляции. Таким образом, аналогичный пример в C#:

[Conditional("TRACE")]
public class TraceLoggingAttribute : Attribute
{
  // etc
}

, который заставил бы компилятор выкладывать метаданные для Вашего пользовательского TraceLogging атрибут, только если TRACE символ был определен.

метаданные атрибута нбар доступны во времени выполнения по умолчанию в C# - это только необходимо, если Вы хотите изменить это.

26
ответ дан serg10 26 November 2019 в 20:38
поделиться

Один важный аспект аннотаций Java, на которые я еще не посмотрел подробно: можно написать код, который использует аннотации в javac (с Java 6, я верю) как форма метапрограммирования .

PostSharp позволяет что-то подобное по общему признанию.

(Это далеко от единственной разницы, но это - все, которое у меня есть время для прямо сейчас.)

15
ответ дан Gili 26 November 2019 в 20:38
поделиться

Одно интересное различие - то, что C# позволяет атрибуты уровня ассемблера и модуль. Они применяются к Вашему модулю или блоку и доступны через отражение нормальным способом. Java не обеспечивает отражение о файле банки, таким образом, аннотации уровня банки не возможны.

На самом деле это довольно распространено как Visual Studio файл, названный AssemblyInfo.cs на корневом уровне проекта, который содержит, например:

[assembly: AssemblyVersionAttribute("1.2.3.4")]
[assembly: AssemblyTitleAttribute("My project name blah blah")]
...

нет никакой эквивалентной аннотации уровня банки в Java (хотя с тех пор jdk5, существует немного используемого механизма аннотации уровня пакета - благодаря mmeyers для указания что одно)

12
ответ дан Community 26 November 2019 в 20:38
поделиться

Развитие к тому, что сказал Jon...

И Java 5 и Java 6 позволяют метапрограммирование. Java 5 использует отдельный способный инструмент; Java 6 интегрирует его в компилятор. (Хотя склонный Java 5 все еще доступен в Java 6)

, К сожалению, каждый использует различный API.

я в настоящее время использую Java 5 API для своих Бобовых аннотаций

, См. http://code.google.com/p/javadude/wiki/Annotations для примера (ПРИМЕЧАНИЕ: я в настоящее время делаю некоторые основные обновления, некоторые из которых изменяют API.)

Очень интересный материал... - Scott

3
ответ дан Scott Stanchfield 26 November 2019 в 20:38
поделиться