Java反射与注解
Java反射
1、反射机制概念
在 Java 中的反射机制是指在运行状态中,对于任意一个类都能够知道这个类所有的属性和方法;并且对于任意一个对象,都能够调用它的任意一个方法;这种动态获取信息以及动态调用对象方法的功能成为Java 语言的反射机制。
2、Java反射API
反射API用来生成JVM中的类、接口或则对象的信息。
- Class 类:反射的核心类,可以获取类的属性,方法等信息。
- Field 类:Java.lang.reflec 包中的类,表示类的成员变量,可以用来获取和设置类之中的属性值。
- Method 类: Java.lang.reflec 包中的类,表示类的方法,它可以用来获取类中的方法信息或者执行方法。
- Constructor 类: Java.lang.reflec 包中的类,表示类的构造方法。
3、实例代码展示
/**
* 获取class对象的三种方式
*/
//静态方法 性能和安全性最好 常用方式 类的全路径
Person person = new Person();
person.setName("孙淼");
Class<?> person01 = Class.forName("com.sm.bean.Person");
//类对象.class
Class<Person> person02 = Person.class;
//类的实例对象.getClass方法
Class<? extends Person> person03 = person.getClass();
//通过Class文件创建对象
Person obj1 = (Person)person01.newInstance();
Constructor<?> declaredConstructor = person01.getDeclaredConstructor(null);
Person obj2 = (Person) declaredConstructor.newInstance();
/**
* 获取所有成员属性
*/
//获取所有成员属性,包括私有的
Field[] declaredFields = person01.getDeclaredFields();
//获取所有非私有属性
Field[] fields = person01.getFields();
for (Field declaredField : declaredFields) {
String name = declaredField.getName();
System.out.println(name);
}
/**
* 获取所有成员方法
*/
//获取所有方法,包括私有方法
Method[] declaredMethods = person01.getDeclaredMethods();
Method method = person01.getDeclaredMethod("sayHello");
method.invoke(person);
/**
* 获取所有构造器
*/
Constructor<?>[] declaredConstructors = person01.getDeclaredConstructors();
Java注解
1、概念
Annotation(注解)是 Java 提供的一种对元程序中元素关联信息和元数据(metadata)的途径和方法。Annatation(注解)是一个接口,程序可以通过反射来获取指定程序中元素的 Annotation 对象,然后通过该 Annotation 对象来获取注解中的元数据信息。
2、四种元注解
-
@Target 修饰的对象范围,可被用于 packages、types(类、接口、枚举、Annotation 类型)、类型成员(方法、构造方法、成员变量、枚举值)、方法参数和本地变量(如循环变量、catch 参数)。在 Annotation 类型的声明中使用了 target 可更加明晰其修饰的目标。
-
@Retention 定义 被保留的时间长短(即:被描述的注解在什么范围内有效),有三种取值分别是SOURCE:在源文件中有效(即源文件保留), CLASS:在 class 文件中有效(即 class 保留),RUNTIME:在运行时有效(即运行时保留)
-
@ Documented 用于描述其它类型的 annotation 应该被作为被标注的程序成员的公共 API,因此可以
被例如 javadoc 此类的工具文档化。
-
@Inherited 阐述了某个被标注的类型是被继承的,如果一个使用了@Inherited 修饰的 annotation 类型被用于一个 class,则这个 annotation 将被用于该 class 的子类。
3、注解处理器
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface FruitProvider {
/*供应商编号*/
public int id() default -1;
/*供应商名称*/
public String name() default "";
/*供应商地址*/
public String address() default "";
}
public class Apple {
@FruitProvider(id = 1,name = "陕西红富士集团" , address = "陕西西安市延安路")
private String appleProvider;
public void setAppleProvider(String appleProvider) {
this.appleProvider = appleProvider;
}
public String getAppleProvider() {
return appleProvider;
}
}
//注解处理
public static void getFruitInfo(Class<?> clazz) {
String strFruitProvider = "供应商信息:";
Field[] fields = clazz.getDeclaredFields();
for (Field field : fields) {
if (field.isAnnotationPresent(FruitProvider.class)) {
FruitProvider annotation = field.getAnnotation(FruitProvider.class);
//获取注解信息
strFruitProvider =
"供应商Id" + annotation.id() + " 供应商名称:" + annotation.name() + "供应商地址:"+ annotation.address();
System.out.println(strFruitProvider);
}
}
}