框架设计的灵魂(反射)、注解

一、反射

1、可以将各个组成部分分装为其他对象,这就是反射机制

好处:
可以在程序运行过程中操作这些对象
可以解耦,提高程序的可扩展性

2、java代码在计算机中经历的三个阶段&&获取Class对象的方式
Source源代码阶段-----Class.forName(“全类名”),将字节码文件加载进内存,返回Class对象
Class类对象阶段-----类名.class,通过类名的属性class获取
Runtime运行时阶段-----对象.getClass,getClass()方法在Object类中定义着

	/*
		获取Class对象的三种方式
	*/ 
	Class cls1 = Class.forName("cn.learn.domain.Person"); //多用于配置文件,将类名定义在配置文件中,读取文件、加载类
	Class<Person> cls2 = Person.class; //多用于参数的传递
	Person p = new Person();
	Class cls3 = p.getClass(); //多用于对象的获取字节码的方式

3、Class对象功能

获取多个成员变量:
	/*
		设置值:void set(Object obj,Object value)
		获取值:get(Object obj)
		忽略访问权限修饰符的安全检查:setAccept(true) //暴力反射
	*/
	Filed[] getFields() //获取所有public修饰的成员变量
	Filed getField(String name)
	
	Filed[] getDeclaredFields() //获取所有的成员变量,不考虑修饰符
	Filed getDeclaredField(String name)

获取多个构造方法:
	/*
		创建对象:T newInstance(Object... initargs)
	*/
	Constructor<?>[] getConstrutors()
	Constructor<T> getConstrutor(<?>... parameterTypes)
	
	Constructor<?>[] getDeclaredConstrutors() 
	Constructor<T> getDeclaredConstrutor(<?>... parameterTypes)
	
获取多个成员方法:
	/*
		执行方法:Object invoke(Object obj,Object... args)
		获取方法名称:String getName
	*/
	Method[] getMethods()
	Method[] getMethods(String name,<?>... parameterTypes)
	
	Method[] getDeclaredMethods()
	Method[] getDeclaredMethods(String name,<?>... parameterTypes)
	
获取类名:
	String getName()

二、注解(元数据)

1、作用分类
编写文档:通过代码里标识的注解生成文档
代码分析:通过代码里标识的注解对代码生成分析【使用反射】
编译检查:通过代码里标识的注解让编译器能够实现基本的编译检查【Override】

2、JDK中预定义的一些注解

	@Override:检测被该注解的方法是否是继承自父类接口的
	@Deprecated:该注解标注的内容,表示已过时
	@SuppressWarnings:压制警告 	//一般传递参数all @SuppressWarnings("all
	")

3、自定义注解(注解本质就是一个接口)

	/*
		自定义@MyAnno注解
	*/
	public @interface MyAnno{
	}

1、属性:接口中的抽象方法
要求:属性的返回值类型有下列取值
基本数据类型、String、枚举、以上类型的数组

定义了属性,在使用时需要给属性赋值
如果定义属性时,使用default关键字默认初始化值,则使用注解时,可以不进行属性的赋值
如果只有一个属性需要赋值,且属性的名称是value,则value可以省略,直接定义值即可
数组赋值时,值使用{}包裹,若只有一个值,则可以省略

2、元注解(描述注解的注解)

 	@Target:描述注解能够作用的位置
 		ElementType取值
			type:可以作用于类上
			methed:可以作用于方法上
			fifld:可以作用于成员变量上

 	@Retention:描述注解被保留的阶段
 		@Retention(RetentionPolict.RUNTIME):当前被描述的注解,会保留到class字节码文件中,并被JVM读取到
 		
 	@Documented:描述注解是否被抽取到api文档中
 	@Inherited:描述注解是否被子类继承
  • 5
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值