注解和反射

一、注解

annotation:注解

1、什么是注解

作用

  • 不是程序本身,可以对程序做出解释。
  • 可以被其他程序读取。

格式

@XXXXX(value="")

那里使用

package、class、method、field。

2、元注解

  • @Target :用于描述注解的使用范围。
  • @Retention:表示需要在什么级别保存该注释信息,用于描述注解的生命周期。(SOURCER<CLASS<RUNTIME)
  • @Document:说明该注解将被包含在Javadoc中。
  • @Inherited:说明子类可以继承父类中的该注解。

创建一个简单注解

@Target({ElementType.METHOD,ElementType.TYPE}) //作用到方法上
@Retention(RetentionPolicy.RUNTIME) //表示什么地方有效
@Documented //表示是否将我们的注解生成在JAVAdoc中
@Inherited //子类可以继承父类的注解
public @interface MyAnnotation {
    String name() default "666";
    int age() default 18;
}

二、反射

1、什么是反射

允许程序在执行期借助Reflection取得任何类的内部信息,并能直接操作任意对象的内部属性及方法。

优点:

可以实现动态创建对象和编译,体现出很大的灵活性。

缺点:

对性能有影响,使用反射是一种解释操作,我们可以告诉JVM,我们希望做什么并且他满足我们的要求。

2、API

1、获取class对象。

Class name = Class.forName("Test2.Son");
Class<Son> sonClass = Son.class;
Class<? extends Son> aClass = son.getClass();
Class<Integer> type = Integer.TYPE;
Class<?> superclass = aClass.getSuperclass();//获取父类

什么会有class对象

class,interface,[],enum,annotation,primitive type,void。

2、class对象API。

//获取包名+类的名字
name.getName();
//获取类名
name.getSimpleName();
//获取类的public属性
Field[] fields = name.getFields();
//获取类的全部属性
Field[] declaredFields = name.getDeclaredFields();
//获取指定public属性的值
Field[] value = name.getFields("xxx");
//获取类的方法
name.getMethods();
//获取指定方法
name.getMethod("methodname",paraType);
//获取指定构造器
name.getConstructors();
......

3、获取泛型信息

Class name = Class.forName("Test2.Son");
Method test = name.getMethod("test", List.class);
Type[] types = test.getGenericExceptionTypes();

4、获取注解信息

Class name = Class.forName("Test2.Son");
Method test = name.getMethod("test", List.class);
MyAnnotation annotations = test.getAnnotation(MyAnnotation.class);
System.out.println(annotations.age());
System.out.println(annotations.name());

5、动态执行方法

/**
     * 
     * @param obj
     *            待执行方法的对象
     * @param ClassName
     *            待执行方法对象的类
     * @param MethodName
     *            待执行的方法名
     * @param ParameterValue
     *            待执行方法的参数
     */
    public void execute(Object obj, String ClassName, String MethodName,
            String ParameterValue) {
        Class cls = null;
        try {
            cls = Class.forName(ClassName);
        } catch (ClassNotFoundException e) {
            // 通过ClassName反射获取该类失败
            e.printStackTrace();
        }
        Method method = null;
        try {
            method = cls.getMethod(MethodName, String.class);
        } catch (SecurityException e) {
            // 通过MethodName反射获取该方法失败,SecurityManager校验失败
            e.printStackTrace();
        } catch (NoSuchMethodException e) {
            // 通过MethodName反射获取该方法失败,该方法不存在
            e.printStackTrace();
        }
        try {
            method.invoke(obj, ParameterValue);
        } catch (IllegalArgumentException e) {
            // 反射执行该方法失败,参数不正确
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            // 反射执行该方法失败,无法执行
            e.printStackTrace();
        } catch (InvocationTargetException e) {
            // 反射执行该方法失败,该方法本身抛出异常
            e.printStackTrace();
        }
    }

简单总结

原文地址:https://www.cnblogs.com/kenai/p/14259780.html