Estoy usando la reflexión en Java para obtener información de la anotación TestNG como en el fragmento de código a continuación:
Reflections reflections = new Reflections("", new MethodAnnotationsScanner()) Set<Method> annotated = reflections.getMethodsAnnotatedWith(Test.class)Actualmente, tengo un marco de broma con un complemento decorado con broma para ayudar en el uso de anotaciones.
¿Cómo puedo replicar el mismo método de reflexión en Java pero en mecanografiado para recopilar esta información de las anotaciones?
Eche un vistazo a Decorators + Reflect Metadata API de Typescript, que también se puede habilitar para el compilador TS. No funciona exactamente como Java, pero aún puede recopilar la información requerida sobre las entidades anotadas. Pequeño ejemplo de cómo recopilar clases anotadas:
const myTypes: any[] = [] @annotation class MyClass { type = "report"; title: string; constructor(t: string) { this.title = t; } } function annotation(constructor: Function) { myTypes.push(constructor) } console.log('All annotated classes', myTypes);Prueba tst-reflect . Es un sistema de reflexión bastante avanzado para TypeScript ( usando un complemento de transformador de TypeScript personalizado ).
Esto debería ser equivalente a su código Java:
import { reflect, Type } from "tst-reflect"; // Some decorator... function test(_, __) { } @reflect() class A { @test foo() { return 0; } bar() { return "lorem ipsum"; } } @reflect() class B { @test bar() { return "lorem ipsum"; } } @reflect() class C { baz() { return "lorem ipsum"; } } const decoratedMethods = Type.getTypes() .flatMap(type => type.getMethods().map(method => ({ method, type }))) .filter(entry => entry.method.getDecorators().some(decorator => decorator.name == "test")); for (let entry of decoratedMethods) { console.log(entry.method.name, "in", entry.type.name); }Producción
foo in A bar in BConsulta Sinopsis . Puede crear instancias de esos tipos (incluso si son de diferentes archivos) y llamar a esos métodos. Además, esos decoradores pueden tener argumentos, por lo que podrá filtrar métodos con los mismos decoradores pero diferentes argumentos.
tst-reflect aún está en desarrollo, por lo que las búsquedas globales de tipos requieren esos decoradores @reflect o decoradores personalizados con la etiqueta @reflect JSDoc; la razón es la optimización del tamaño de los metadatos generados. Pero hay un problema para ampliar la configuración "incluye" patrones glob que incluirán todos los tipos de todos los módulos que coincidan con esos globs.
PD: Consulte la wiki de configuración y use esta configuración:
tsconfig.json
{ "compilerOptions": { // your options... // ADD THIS! "plugins": [ { "transform": "tst-reflect-transformer" } ] }, // ADD THIS! "reflection": { "metadata": { "type": "typelib" // this mode will generate and auto-import library with generated reflection metadata } } }