I can change it for the former (you need to use a string array, though), the latter is only possible in Java 1.8+.
On 21 February 2016 at 22:22, Remko Popma <[email protected]> wrote: > Can an annotation have multiple values? > @PerformanceSensitive("AllocationFree", "CriticalPath") > > Or can a method be annotated with the same annotation appear multiple > times? > Both @PerformanceSensitive("AllocationFree") > and @PerformanceSensitive("CriticalPath")? > > > On Monday, 22 February 2016, Remko Popma <[email protected]> wrote: > >> I like @PerformanceSensitive very much! >> >> I can then see specific variations like >> @PerformanceSensitive("InlineSize") >> @PerformanceSensitive("AllocationFree") >> >> >> >> Sent from my iPhone >> >> On 2016/02/22, at 12:48, Gary Gregory <[email protected]> wrote: >> >> Well, a method can be on the critical path and not have been >> hand-optimized either because it is already as fast as can be or we have >> not gotten around to it (which make you want to have a @NeedsOptimization, >> rabbit hole warning!). So we could have both. Some methods would >> be @CriticalPath, and some both @CriticalPath and @HandOptimized. But you >> would not have just @HandOptimized or if you did it would >> imply @CriticalPath. which is a bit too clever .... >> >> Gary >> >> On Sun, Feb 21, 2016 at 7:43 PM, Matt Sicker <[email protected]> wrote: >> >>> Those both sound better, but I can't decide on which. >>> >>> On 21 February 2016 at 21:32, Gary Gregory <[email protected]> >>> wrote: >>> >>>> I wonder if @CriticalPath or @HandOptimized would convey better what we >>>> are trying to express? >>>> >>>> Gary >>>> >>>> >>>> ---------- Forwarded message ---------- >>>> From: <[email protected]> >>>> Date: Sun, Feb 21, 2016 at 7:02 PM >>>> Subject: logging-log4j2 git commit: Add PerformanceSensitive annotation. >>>> To: [email protected] >>>> >>>> >>>> Repository: logging-log4j2 >>>> Updated Branches: >>>> refs/heads/master f884234a8 -> 4aa7df826 >>>> >>>> >>>> Add PerformanceSensitive annotation. >>>> >>>> >>>> Project: http://git-wip-us.apache.org/repos/asf/logging-log4j2/repo >>>> Commit: >>>> http://git-wip-us.apache.org/repos/asf/logging-log4j2/commit/4aa7df82 >>>> Tree: >>>> http://git-wip-us.apache.org/repos/asf/logging-log4j2/tree/4aa7df82 >>>> Diff: >>>> http://git-wip-us.apache.org/repos/asf/logging-log4j2/diff/4aa7df82 >>>> >>>> Branch: refs/heads/master >>>> Commit: 4aa7df826de7e359ac3bde98597fe5ca6e4b5901 >>>> Parents: f884234 >>>> Author: Matt Sicker <[email protected]> >>>> Authored: Sun Feb 21 21:02:51 2016 -0600 >>>> Committer: Matt Sicker <[email protected]> >>>> Committed: Sun Feb 21 21:02:51 2016 -0600 >>>> >>>> ---------------------------------------------------------------------- >>>> .../log4j/util/PerformanceSensitive.java | 29 >>>> ++++++++++++++++++++ >>>> .../logging/log4j/util/ReflectionUtil.java | 5 ++++ >>>> .../log4j/core/config/AppenderControl.java | 4 +++ >>>> .../core/config/AppenderControlArraySet.java | 8 ++++-- >>>> 4 files changed, 43 insertions(+), 3 deletions(-) >>>> ---------------------------------------------------------------------- >>>> >>>> >>>> >>>> http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/4aa7df82/log4j-api/src/main/java/org/apache/logging/log4j/util/PerformanceSensitive.java >>>> ---------------------------------------------------------------------- >>>> diff --git >>>> a/log4j-api/src/main/java/org/apache/logging/log4j/util/PerformanceSensitive.java >>>> b/log4j-api/src/main/java/org/apache/logging/log4j/util/PerformanceSensitive.java >>>> new file mode 100644 >>>> index 0000000..3fbb058 >>>> --- /dev/null >>>> +++ >>>> b/log4j-api/src/main/java/org/apache/logging/log4j/util/PerformanceSensitive.java >>>> @@ -0,0 +1,29 @@ >>>> +/* >>>> + * Licensed to the Apache Software Foundation (ASF) under one or more >>>> + * contributor license agreements. See the NOTICE file distributed with >>>> + * this work for additional information regarding copyright ownership. >>>> + * The ASF licenses this file to You under the Apache license, Version >>>> 2.0 >>>> + * (the "License"); you may not use this file except in compliance with >>>> + * the License. You may obtain a copy of the License at >>>> + * >>>> + * http://www.apache.org/licenses/LICENSE-2.0 >>>> + * >>>> + * Unless required by applicable law or agreed to in writing, software >>>> + * distributed under the License is distributed on an "AS IS" BASIS, >>>> + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or >>>> implied. >>>> + * See the license for the specific language governing permissions and >>>> + * limitations under the license. >>>> + */ >>>> + >>>> +package org.apache.logging.log4j.util; >>>> + >>>> +/** >>>> + * Indicates that a particular annotated construct was written with >>>> certain performance constraints in mind that >>>> + * should be considered when modifying or testing. >>>> + * >>>> + * @since 2.6 >>>> + */ >>>> +public @interface PerformanceSensitive { >>>> + /** Description of why this is written the way it is. */ >>>> + String value() default ""; >>>> +} >>>> >>>> >>>> http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/4aa7df82/log4j-api/src/main/java/org/apache/logging/log4j/util/ReflectionUtil.java >>>> ---------------------------------------------------------------------- >>>> diff --git >>>> a/log4j-api/src/main/java/org/apache/logging/log4j/util/ReflectionUtil.java >>>> b/log4j-api/src/main/java/org/apache/logging/log4j/util/ReflectionUtil.java >>>> index 6e7ce4a..dec2350 100644 >>>> --- >>>> a/log4j-api/src/main/java/org/apache/logging/log4j/util/ReflectionUtil.java >>>> +++ >>>> b/log4j-api/src/main/java/org/apache/logging/log4j/util/ReflectionUtil.java >>>> @@ -117,6 +117,7 @@ public final class ReflectionUtil { >>>> // (MS) I believe this would work without any modifications >>>> elsewhere, but I could be wrong >>>> >>>> // migrated from ReflectiveCallerClassUtility >>>> + @PerformanceSensitive >>>> public static Class<?> getCallerClass(final int depth) { >>>> if (depth < 0) { >>>> throw new >>>> IndexOutOfBoundsException(Integer.toString(depth)); >>>> @@ -193,11 +194,13 @@ public final class ReflectionUtil { >>>> } >>>> >>>> // migrated from ClassLoaderContextSelector >>>> + @PerformanceSensitive >>>> public static Class<?> getCallerClass(final String fqcn) { >>>> return getCallerClass(fqcn, Strings.EMPTY); >>>> } >>>> >>>> // migrated from Log4jLoggerFactory >>>> + @PerformanceSensitive >>>> public static Class<?> getCallerClass(final String fqcn, final >>>> String pkg) { >>>> if (supportsFastReflection()) { >>>> boolean next = false; >>>> @@ -227,6 +230,7 @@ public final class ReflectionUtil { >>>> } >>>> >>>> // added for use in LoggerAdapter implementations mainly >>>> + @PerformanceSensitive >>>> public static Class<?> getCallerClass(final Class<?> anchor) { >>>> if (supportsFastReflection()) { >>>> boolean next = false; >>>> @@ -270,6 +274,7 @@ public final class ReflectionUtil { >>>> } >>>> >>>> // migrated from ThrowableProxy >>>> + @PerformanceSensitive >>>> public static Stack<Class<?>> getCurrentStackTrace() { >>>> // benchmarks show that using the SecurityManager is much >>>> faster than looping through getCallerClass(int) >>>> if (SECURITY_MANAGER != null) { >>>> >>>> >>>> http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/4aa7df82/log4j-core/src/main/java/org/apache/logging/log4j/core/config/AppenderControl.java >>>> ---------------------------------------------------------------------- >>>> diff --git >>>> a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/AppenderControl.java >>>> b/log4j-core/src/main/java/org/apache/logging/log4j/core/config/AppenderControl.java >>>> index f65011d..175c9e1 100644 >>>> --- >>>> a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/AppenderControl.java >>>> +++ >>>> b/log4j-core/src/main/java/org/apache/logging/log4j/core/config/AppenderControl.java >>>> @@ -25,6 +25,7 @@ import org.apache.logging.log4j.core.LogEvent; >>>> import org.apache.logging.log4j.core.appender.AppenderLoggingException; >>>> import org.apache.logging.log4j.core.filter.AbstractFilterable; >>>> import org.apache.logging.log4j.core.filter.Filterable; >>>> +import org.apache.logging.log4j.util.PerformanceSensitive; >>>> >>>> /** >>>> * Wraps an {@link Appender} with details an appender implementation >>>> shouldn't need to know about. >>>> @@ -88,14 +89,17 @@ public class AppenderControl extends >>>> AbstractFilterable { >>>> return isFilteredByAppenderControl(event) || >>>> isFilteredByLevel(event) || isRecursiveCall(); >>>> } >>>> >>>> + @PerformanceSensitive >>>> private boolean isFilteredByAppenderControl(final LogEvent event) { >>>> return getFilter() != null && Filter.Result.DENY == >>>> getFilter().filter(event); >>>> } >>>> >>>> + @PerformanceSensitive >>>> private boolean isFilteredByLevel(final LogEvent event) { >>>> return level != null && intLevel < event.getLevel().intLevel(); >>>> } >>>> >>>> + @PerformanceSensitive >>>> private boolean isRecursiveCall() { >>>> if (recursive.get() != null) { >>>> appenderErrorHandlerMessage("Recursive call to appender "); >>>> >>>> >>>> http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/4aa7df82/log4j-core/src/main/java/org/apache/logging/log4j/core/config/AppenderControlArraySet.java >>>> ---------------------------------------------------------------------- >>>> diff --git >>>> a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/AppenderControlArraySet.java >>>> b/log4j-core/src/main/java/org/apache/logging/log4j/core/config/AppenderControlArraySet.java >>>> index 78a42b3..d30ce32 100644 >>>> --- >>>> a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/AppenderControlArraySet.java >>>> +++ >>>> b/log4j-core/src/main/java/org/apache/logging/log4j/core/config/AppenderControlArraySet.java >>>> @@ -16,17 +16,19 @@ >>>> */ >>>> package org.apache.logging.log4j.core.config; >>>> >>>> -import org.apache.logging.log4j.core.Appender; >>>> - >>>> import java.util.Arrays; >>>> import java.util.HashMap; >>>> import java.util.Map; >>>> import java.util.Objects; >>>> import java.util.concurrent.atomic.AtomicReference; >>>> >>>> +import org.apache.logging.log4j.core.Appender; >>>> +import org.apache.logging.log4j.util.PerformanceSensitive; >>>> + >>>> /** >>>> * Data structure with similar semantics to CopyOnWriteArraySet, but >>>> giving direct access to the underlying array. >>>> */ >>>> +@PerformanceSensitive >>>> public class AppenderControlArraySet { >>>> private final AtomicReference<AppenderControl[]> appenderArray = >>>> new AtomicReference<>(new AppenderControl[0]); >>>> >>>> @@ -117,4 +119,4 @@ public class AppenderControlArraySet { >>>> public AppenderControl[] get() { >>>> return appenderArray.get(); >>>> } >>>> -} >>>> \ No newline at end of file >>>> +} >>>> >>>> >>>> >>>> >>>> -- >>>> E-Mail: [email protected] | [email protected] >>>> Java Persistence with Hibernate, Second Edition >>>> <http://www.manning.com/bauer3/> >>>> JUnit in Action, Second Edition <http://www.manning.com/tahchiev/> >>>> Spring Batch in Action <http://www.manning.com/templier/> >>>> Blog: http://garygregory.wordpress.com >>>> Home: http://garygregory.com/ >>>> Tweet! http://twitter.com/GaryGregory >>>> >>> >>> >>> >>> -- >>> Matt Sicker <[email protected]> >>> >> >> >> >> -- >> E-Mail: [email protected] | [email protected] >> Java Persistence with Hibernate, Second Edition >> <http://www.manning.com/bauer3/> >> JUnit in Action, Second Edition <http://www.manning.com/tahchiev/> >> Spring Batch in Action <http://www.manning.com/templier/> >> Blog: http://garygregory.wordpress.com >> Home: http://garygregory.com/ >> Tweet! http://twitter.com/GaryGregory >> >> -- Matt Sicker <[email protected]>
