使用反射的装配方法可以通过两种方式进行比较,分别是基于类型和基于注解。
public class ReflectBasedAssembly {
public static void main(String[] args) {
try {
// 获取类的信息
Class> clazz = Class.forName("com.example.MyClass");
// 实例化对象
Object obj = clazz.getDeclaredConstructor().newInstance();
// 获取属性并设置值
Field field = clazz.getDeclaredField("myField");
field.setAccessible(true);
field.set(obj, "Hello World");
// 调用方法
Method method = clazz.getDeclaredMethod("myMethod");
method.invoke(obj);
} catch (Exception e) {
e.printStackTrace();
}
}
}
public class AnnotationBasedAssembly {
public static void main(String[] args) {
try {
// 获取类的信息
Class> clazz = Class.forName("com.example.MyClass");
// 实例化对象
Object obj = clazz.getDeclaredConstructor().newInstance();
// 获取所有方法
Method[] methods = clazz.getDeclaredMethods();
// 遍历方法,查找带有指定注解的方法
for (Method method : methods) {
if (method.isAnnotationPresent(MyAnnotation.class)) {
// 解析注解并进行装配
MyAnnotation annotation = method.getAnnotation(MyAnnotation.class);
String value = annotation.value();
// 设置属性值
Field field = clazz.getDeclaredField("myField");
field.setAccessible(true);
field.set(obj, value);
// 调用方法
method.invoke(obj);
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
@interface MyAnnotation {
String value() default "";
}
public class MyClass {
private String myField;
@MyAnnotation(value = "Hello World")
public void myMethod() {
System.out.println(myField);
}
}
这两种方法都可以通过反射来动态地进行装配和调用,但基于注解的方法更加灵活和可扩展,可以根据实际需求进行定制化的装配逻辑。
下一篇:比较两种SSH转发的安全性。