什么是反射
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());//赋值到将要使用的类
}
}