Java 注解与反射

Java 注解与反射

一、注解

常见注解
@Override 重写
@Deprecated 已过时
@SuppressWarning(" ") 抑制警告

元注解
元注解就是用于说明其他注解的注解,Java一共定义了4个元注解
@Target(value = ElementType. ) :用于描述注解的使用范围(即被描述的注解可以用在什么地方,比如类(TYPE)、方法(METHOD)、变量(FIELD)等)
@Retention(value = RetentionPolicy. ):表示需要在什么级别保存该注释信息,用于描述注解的生命周期,有三个取值(source、class、runtime)即源码级别、字节码级别、运行级别。
@Document:说明该注解将被包含在Javadoc中。
@Inherited:说明子类可以继承父类中的该注解。

二、反射
链接: link.

反射是Java被视为动态语言的关键,反射机制允许程序在执行期间借助Reflection API取得类的任何内部信息,并能直接操作任意对象的内部属性及方法。

一个类在完成加载之后,在堆内存的方法区中就产生了一个该类的Class类型的对象(Class也是一个类,一个类只有一个Class对象),这个Class对象就包含了完整的类的结构信息

1、获取Class对象的方法

若已知具体的类,可以通过类的class属性获取

Class clazz = Person.class;

已知某个类的实例,调用该实例的getClass()方法获取Class对象

Class clazz = person.getClass();

已知一个类的全类名,且该类在类路径下,可通过Class类的静态方法forName()获取,如果该类不存在则会抛出ClassNotFoundException()

Class clazz = Class.forName("com.wl.test.Student");

2、类的加载机制
链接: link.
链接: link.

Java语言里,类加载都是在程序运行期间完成的。简单来说,类的加载就是把类的字节码文件加载到内存(方法区),并生成该类对应的Class对象的过程。

3、通过Class对象获取类的信息

获取成员变量Field

//获取Class对象
Class clazz = Class.forName("com.wl.test.Student");

//获取成员属性
Field[] allFields = clazz.getDeclaredFields();//获取class对象的所有属性(包括私有属性),不包括其父类的属性
Field[] publicFields = clazz.getFields();//获取class对象的public属性, 包括其父类的属性
Field ageField = clazz.getDeclaredField("age");//获取class指定属性 
Field desField = clazz.getField("des");//获取class指定的public属性

field.setAccessible(true);//设置是否允许访问,如果属性是private的,要手动设置允许访问为true

获取成员方法Method

//获取Class对象
Class clazz = Class.forName("com.wl.test.Student");

//获取成员方法
Method[] methods = clazz.getDeclaredMethods();//获取class对象的所有声明方法(包括私有方法),不包括其父类的方法 
Method[] allMethods = clazz.getMethods();//获取class对象的所有public方法,包括父类的方法 
Method setName = clazz.getMethod("setName", String.class);//返回此Class对象对应类的、带指定形参列表的public方法 
Method setName = clazz.getDeclaredMethod("setName", String.class);//返回此Class对象对应类的、带指定形参列表的方法

//使用
Student student = clazz.newInstance();//通过Class构造一个对象,本质是调用了类的无参构造器
setName.invoke(student,"小花");//通过invoke调用该方法,参数第一个为实例对象,后面为具体参数值

获取构造函数Constructor

Class clazz = Class.forName("com.wl.test.Student");

Constructor[] allConstructors = clazz.getDeclaredConstructors();//获取class对象的所有声明构造函数 
Constructor[] publicConstructors = clazz.getConstructors();//获取class对象所有public构造函数 
Constructor constructor = clazz.getDeclaredConstructor(String.class);//获取指定声明有参构造函数 
Constructor publicConstructor = clazz.getConstructor(String.class);//获取指定声明的public构造函数

//通过构造器也可以创建对象
Student student = constructor.newInstance("小花"001,16);

注意:对于私有的属性和方法,在使用时要设置是否允许访问,即setAccessible(true)才能使用。

获取泛型信息:
getGenericParameterTypes()、getGenericReturnType()

public class Test{
	
	public void test01(Map<String,User> map,List<User> list){
		System.out.println("test01");
	}
	public Map<String,User> test02(){
		System.out.println("test02");
		return null;
	}

	public static void main(String[] args){
		//获取函数参数泛型类型
		Method method =Test.class.getMethod("test01",Map.class,List.class);
		Type[] types = method.getGenericParameterTypes();
		for(Type type : types){
			if(type instanceof ParameterizedType){
				Type[] actualTypes = ((ParameterizedType) type).getActualTYpeArguments();
				for(Type actualType : actualTypes ){
					System.out.println(actualType );
				}
			}
		}

		//获取函数返回值泛型类型
		method =Test.class.getMethod("test02",null);
		Type type = method.getGenericReturnType();
		if(type instanceof ParameterizedType){
			Type[] actualTypes = ((ParameterizedType) type).getActualTYpeArguments();
				for(Type actualType : actualTypes ){
					System.out.println(actualType );
				}
		}
	}
}

获取注解信息:
通过反射API里的getAnnotation()方法

链接: link.
链接: link.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值