注解与反射

一、注解
在这里插入图片描述
主要使用到的是@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]);
	}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值