一、注解
主要使用到的是@Target和@Retention注解,@Target用于描述注解的使用范围,其中@Retention一般选择RUNITIME,表示在程序运行时使用的注解。
1.@Target常用的3个取值,可以同时添加多个值
(1)ElementType.TYPE 作用在类名上;
(2)ElementType.FIELD 作用在属性名上;
(3)ElementType.METHOD 作用在方法名上;
(一).定义一个简单的注解
package testAnnotation;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Retention(RetentionPolicy.RUNTIME)
@Target(value={ElementType.FIELD,ElementType.TYPE})
public @interface Excel {
String name() default "szd";
String[] value();
}
这里需要注意,String name();和String[] value();并不是方法,而是注解的参数,由参数类型+参数名构成,可以只有一个值,也可以是一个数组。也可以通过default设置默认值。
二、反射
核心:Class类,表示类的类
反射获取Class类的方式
Class clz=(Class<User>) Class.forName("reflection.User");
Class clz2= User.class;
User user = new User();
Class clz3 = user.getClass();
反射可以获取类运行时的结构,包括字段、方法、构造器、父类、接口、注解
1.获取类的名字
Class<User> clz=(Class<User>) Class.forName("reflection.User");
System.out.println(clz.getName());
System.out.println(clz.getSimpleName());
2.获取属性
//获取public属性
Field[] f2=clz.getFields();
Field f3=clz.getField("name");
//获取所有属性包括私有属性
Field f=clz.getDeclaredField("name");
Field[] fs=clz.getDeclaredFields();
3.获取方法
//获取public方法
Method method=clz.getMethod("sayHello", null);
Method[] methods=clz.getMethods();
//获取所有方法包括私有方法,第二个参数为参数类型的Class
Method method=clz.getDeclaredMethod("sayHello", String.class);
Method[] methods=clz.getDeclaredMethods();
4.获取构造器
//获得构造器信息
Constructor[] constructors=clz.getConstructors();
Constructor[] constructors=clz.getDeclaredConstructors();
Constructor constructor=clz.getDeclaredConstructor(String.class,int.class);
5.通过反射创建对象
//1.默认直接调用类的无参构造
User user = (User) clz3.newInstance();
//2.通过有参构造器来创建对象
Constructor constructor=clz.getDeclaredConstructor(String.class,int.class);
User user = (User) constructor.newInstance("梨花烧",18);
6.通过反射设置属性值
User user = (User) clz.newInstance();
Field f=clz.getDeclaredField("name");
//关闭安全检查,来提高效率
f.setAccessible(true);
f.set(user , "梨花烧")
7.通过反射调用方法
User user = (User) clz3.newInstance();
Method method=clz.setMethod("setName", String.class);
method.setAccessible(true);
method.invoke(user , "梨花烧");
8.通过反射获取泛型
User对象
public class User {
public void test(List<String> list, Map<String,Integer> map ,String str){
System.out.println("test");
}
public Map<String,Integer> test2(){
return null;
}
}
(1)获取参数泛型
//获取参数和泛型信息,必须JDK1.8,否则报错
Method method=User.class.getDeclaredMethod("test", List.class, Map.class, String.class);
Type[] genericParameterTypes = method.getGenericParameterTypes();
for(Type genericParameterType:genericParameterTypes){
if(genericParameterType instanceof ParameterizedType){
Type[] actualTypeArguments = ((ParameterizedType) genericParameterType).getActualTypeArguments();
for (Type actualTypeArgument : actualTypeArguments) {
System.out.println(actualTypeArgument);
}
}
}
(2)获取返回值泛型
Method method=User.class.getDeclaredMethod("test2",null);
Type genericReturnType = method.getGenericReturnType();
if(genericReturnType instanceof ParameterizedType){
Type[] actualTypeArguments = ((ParameterizedType) genericReturnType).getActualTypeArguments();
for (Type actualTypeArgument : actualTypeArguments) {
System.out.println(actualTypeArgument);
}
}
9.反射获取注解信息
(1)写一个注解类
package testAnnotation;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Retention(RetentionPolicy.RUNTIME)
@Target(value={ElementType.FIELD,ElementType.TYPE})
public @interface Excel {
String[] value();
}
(2)一个Teacher类
package testAnnotation;
public class Teacher {
@Excel("aa")
private String name;
@Excel("bb")
private int id;
@Excel("cc")
private int age;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public Teacher(){};
public Teacher(String name, int id, int age) {
super();
this.name = name;
this.id = id;
this.age = age;
}
@Override
public String toString() {
return "Teacher [name=" + name + ", id=" + id + ", age=" + age + "]";
}
}
(3)通过反射获取注解
package testAnnotation;
import java.lang.reflect.Field;
public class testAnnotationReflection {
public static void main(String args[]) throws Exception{
Class c = Class.forName("testAnnotation.Teacher");
Field field = c.getDeclaredField("age");
Excel e = field.getAnnotation(Excel.class);
String[] strs = e.value();
System.out.println(strs[0]);
}
}