[英]Java custom annotation that injects another object
我正在尝试学习如何用Java编写自定义注释。
出于学习目的,我决定尝试创建一个注释,以使该字段可用于使用该注释的类,即:注入,但不必作为单例使它变得更简单(我认为),但这是受欢迎的。好。
================================= CLASS 1 =============== ==================
import java.lang.annotation.ElementType;
import java.lang.annotation.Inherited;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
@Inherited
public @interface AutoInject {
}
================================= CLASS 2 ================ ==================
// The class to be injected in Main.java
public class TestClass0 {
void printSomething(){
System.out.println("PrintSomething: TestClass0");
}
}
================================= CLASS 3 ================ ==================
import java.lang.annotation.Annotation;
import java.lang.reflect.Field;
public class Main {
TestClass0 ts0;
// Injecting here!!
@AutoInject
public TestClass0 getTso() {
return ts0;
}
public void setTso(TestClass0 ts) {
ts0 = ts;
}
public static void main(String[] args) {
performAnnotationScanOnClass (Main.class);
// Create instance
Main main = new Main();
main.getTso().printSomething();
}
public static void performAnnotationScanOnClass(Class<?> clazz) {
Field[] fields = clazz.getDeclaredFields();
for ( Field field : fields ) {
Annotation[] annotations = field.getAnnotations();
for (Annotation annotation : annotations) {
if ( annotation instanceof AutoInject ) {
AutoInject autoInject = (AutoInject) annotation;
// if ( field.get( ... ) == null )
// field.set( ... , value)
}
}
}
}
}
正如你在static void main()中看到的那样...我试图在TestClass0中调用该方法,期望它可用。 我知道上面的内容很快就会完成,但我刚开始学习注释并希望得到你的指导。
我们如何触发一段代码,该代码在new上或调用get方法时初始化一个属性。 使用注释。 我在想不改变调用方法。
谢谢!
您正在迭代扫描代码中的字段,但您定义的注释仅允许对方法进行注释。 这意味着您将永远不会看到任何注释。
看起来你正在尝试使用像java bean属性这样的字段。 下面是使用AutoInject和TestClass0类的setter注入示例:
Main.java:
import java.beans.BeanInfo;
import java.beans.Introspector;
import java.beans.PropertyDescriptor;
import java.lang.annotation.Annotation;
import java.lang.reflect.Method;
public class Main {
public TestClass0 ts0;
public TestClass0 getTso() {
return ts0;
}
@AutoInject
public void setTso(TestClass0 ts) {
ts0 = ts;
}
public static void main(String[] args) {
// Create instance
Main main = new Main();
injectDependencies(main).getTso().printSomething();
}
public static <T> T injectDependencies(final T obj) {
try {
Class clazz = obj.getClass();
BeanInfo beanInfo = Introspector.getBeanInfo(clazz);
for (PropertyDescriptor pd : beanInfo.getPropertyDescriptors()) {
Method readMethod = pd.getReadMethod();
Method writeMethod = pd.getWriteMethod();
if (writeMethod == null) {
continue;
}
Object existingVal = pd.getReadMethod().invoke(obj);
if (existingVal == null) {
for (Annotation annotation : writeMethod.getAnnotations()) {
if (annotation instanceof AutoInject) {
Class propertyType = pd.getPropertyType();
writeMethod.invoke(obj, propertyType.newInstance());
}
}
}
}
} catch (Exception e) {
// do something intelligent :)
}
return obj;
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.