简单的反射与注解实践
反射的使用
指在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法,对于任意一个对象,都能调用它的任意一个方法.这种动态获取信息,以及动态调用对象方法的功能叫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