kalix.javasdk.impl.Reflect.scala Maven / Gradle / Ivy
/*
* Copyright 2021 Lightbend Inc.
*
* Licensed 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 kalix.javasdk.impl
import java.lang.annotation.Annotation
import java.lang.reflect.AnnotatedElement
import java.lang.reflect.Method
import java.lang.reflect.Modifier
import scala.reflect.ClassTag
/**
* Class extension to facilitate some reflection common usages.
*/
object Reflect {
object Syntax {
implicit class ClassOps(clazz: Class[_]) {
def isPublic: Boolean = Modifier.isPublic(clazz.getModifiers)
def getAnnotationOption[A <: Annotation](implicit ev: ClassTag[A]): Option[A] =
if (clazz.isPublic)
Option(clazz.getAnnotation(ev.runtimeClass.asInstanceOf[Class[A]]))
else
None
}
implicit class MethodOps(javaMethod: Method) {
def isPublic: Boolean = Modifier.isPublic(javaMethod.getModifiers)
}
implicit class AnnotatedElementOps(annotated: AnnotatedElement) {
def hasAnnotation[A <: Annotation](implicit ev: ClassTag[A]): Boolean =
annotated.getAnnotation(ev.runtimeClass.asInstanceOf[Class[Annotation]]) != null
}
}
}