【java反射/注解】简单的反射与注解实践

简单的反射与注解实践

反射的使用

指在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法,对于任意一个对象,都能调用它的任意一个方法.这种动态获取信息,以及动态调用对象方法的功能叫java语言的反射机制。

ps.JCA.Java Security能控制反射访问范围

反射常用方法

getClass()

getClassLoader()

构造器(constructor)

如:getConstructor(),getDeclaredConstructor()

方法(method)

如:getMethod(),getDeclaredMethod()

属性值(field)

注解就属于属性值中的内容

注解的使用

弄明白以下几个重要注解的属性,注解就容易了:

@Inherited 指定注解是可继承的

@Target 指定注解的运用目标,该注解用在什么上

  • ElementType.ANNOTATION_TYPE 可以给一个注解进行注解
  • ElementType.CONSTRUCTOR 可以给构造方法进行注解
  • ElementType.FIELD 可以给属性进行注解
  • ElementType.LOCAL_VARIABLE 可以给局部变量进行注解
  • ElementType.METHOD 可以给方法进行注解
  • ElementType.PACKAGE 可以给一个包进行注解
  • ElementType.PARAMETER 可以给一个方法内的参数进行注解
  • ElementType.TYPE 可以给一个类型进行注解,比如类、接口、枚举

@Retention 注解的生命周期:应该可以用生命周期这个词来形容吧..

  • RetentionPolicy.SOURCE 注解只在源码阶段保留,在编译器进行编译时它将被丢弃忽视。
  • RetentionPolicy.CLASS 注解只被保留到编译进行的时候,它并不会被加载到 JVM 中。
  • RetentionPolicy.RUNTIME 注解可以保留到程序运行的时候,它会被加载进入到 JVM 中,所以在程序运行时可以获取到它们。

@Repeatable jdk1.8新特性,对于一个域可重复添加该注解

@Documented 它的作用是能够将注解中的元素包含到 Javadoc 中去。

简单实例

Demo功能:使用一个工厂类来根据传递的类名来创建实例,并用注解标明需要创建实例的个数。

1.创建一个注解类,用于表明类需要被实例的个数

package hbi.banktest.dto;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

/**
 * Created by XCXCXCXCX on 2018/8/4.
 */
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
public @interface  Reflection{
    int num() default 1;
}

2.创建测试bean并加入注解

package hbi.banktest.dto;

/**
 * Created by XCXCXCXCX on 2018/8/4.
 */
@Reflection(num = 5)
public class TestBean {
    private long id;
    private String name;
    private static final long DEFAULT_ID = 1;
    private static final String DEFAULT_NAME = "xixi";

    public static long i = 0;
    public TestBean(){
        id = DEFAULT_ID + i++;
        name = DEFAULT_NAME + id;
    }

    public long getId() {
        return id;
    }

    public void setId(long id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String toString(){
        return id+","+name;
    }
}

3.创建工厂类并测试

package hbi.banktest.dto;


import java.util.ArrayList;
import java.util.List;

/**
 * Created by XCXCXCXCX on 2018/8/4.
 */
public class ReflectionFactory<T> {
    public List<T> getBean(Class<T> clazz){
        System.out.println("aaa");
        List<T> list = new ArrayList<>();
        Reflection reflection = clazz.getAnnotation(Reflection.class);
        //Assert.notNull(reflection,"无Reflection注解");
        if(reflection == null){return null;}
        int length = reflection.num();
        try {
            for (int i =0;i < length;i++){
                T t = clazz.newInstance();
                list.add(t);
            }
        } catch (InstantiationException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        }

        return list;
    }

    public static void main(String[] args) {
        ReflectionFactory reflectionFactory = new ReflectionFactory();
        List list = reflectionFactory.getBean(TestBean.class);
        System.out.println(list.size());
        for (int i = 0;i < list.size();i++){
            System.out.println(list.get(i).toString());
        }
    }
}

测试结果:

aaa
5
1,xixi1
1,xixi1
1,xixi1
1,xixi1
1,xixi1

猜你喜欢

转载自blog.csdn.net/xc1158840657/article/details/81409642