Java反射与注解

261 阅读2分钟

什么是反射

Java反射机制是指在运行状态中

对于任意一个类,都能知道这个类的所有属性和方法;
对于任何一个对象,都能够调用它的任何一个方法和属性;

这样动态获取新的以及动态调用对象方法的功能就叫做反射。
用途
java.lang.Class 编译后的class文件的对象
java.lang.reflect.Constructor 构造方法
java.lang.reflect.Field 类的成员变量(属性)
java.lang.reflect.Method 类的成员方法
java.lang.reflect.Modifier 判断方法类型
java.lang.annotation.Annotation 类的注解
//获取类的三种方法:
Class c = Class.forName("java.lang.String");  //这里一定要用完整的包名
Class c1=String.class;
String str = new String();
Class c2=str.getClass();

//获取类的属性(成员变量)
Field[] fields = c.getDeclaredFields();

//获取所有的方法
Method[] ms = c.getDeclaredMethods();

什么是注解

Annotation(注解)就是Java提供了一种源程序中的元素关联任何信息或者任何元数据(metadata)的途径和方法。

Annotation是被动的元数据,永远不会有主动行为,
所以需要通过反射来使用注解让其产生意义。

元注解

给自定义注解使用的注解就是元注解,有以下几种:
@Rentention Rentention

用来标记自定义注解的有效范围,他的取值有以下三种:

RetentionPolicy.SOURCE: 只在源代码中保留 一般都是用来增加代码的理解性或者帮助代码检查之类的,比如我们的Override;

RetentionPolicy.CLASS: 默认的选择,能把注解保留到编译后的字节码class文件中,仅仅到字节码文件中,运行时是无法得到的;

RetentionPolicy.RUNTIME: ,注解不仅 能保留到class字节码文件中,还能在运行通过反射获取到,这也是我们最常用的。

@Target

指定Annotation用于修饰哪些程序元素。
包含一个名为”value“的成员变量,该value成员变量类型为ElementType[ ],ElementType为枚举类型,值有如下几个:

ElementType.TYPE:能修饰类、接口或枚举类型
ElementType.FIELD:能修饰成员变量
ElementType.METHOD:能修饰方法
ElementType.PARAMETER:能修饰参数
ElementType.CONSTRUCTOR:能修饰构造器
ElementType.LOCAL_VARIABLE:能修饰局部变量
ElementType.ANNOTATION_TYPE:能修饰注解
ElementType.PACKAGE:能修饰包

@Documented 可以在javadoc中找到
@Interited 表示注解里的内容可以被子类继承,比如父类中某个成员使用了上述@From(value),From中的value能给子类使用到。

自定义注解

注解示例:
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.FIELD)
public @interface BindAddress
{
    String value() default "127.0.0.0";
}

注解使用示例:
 Class c = Class.forName(TestClass.class.getName());
//实例化一个TestClass对象
TestClass tc= (TestClass) c.newInstance();

// 获取所有的属性
Field[] fields = c.getDeclaredFields();

for (Field field : fields) {
    if(field.isAnnotationPresent(BindPort.class)){
        BindPort port = field.getAnnotation(BindPort.class);
        field.setAccessible(true);
        field.set(tc,port.value());//赋值到将要使用的类
    }
}