java学习笔记(反射,注解,reflect,annotation)菜鸟本菜对于注解以及Java反射的一些体会

软件实习生对于Java反射的学习体会**

本菜鸟是一名准大四学生,于某知名日企也已进行了半年的实习,最近刚刚结束一个web项目,也因为即将过年所以有了一段闲暇时间去学习。在项目中一直不知道那些看着跟接口一样的注解打在字段上面为什么就会起到各种作用,进行了初步的学习,现在因为疫情的原因有时间去整理一下零碎的知识,于是有了这篇笔记,如果有人能看到错误,也请指正一下,我一定虚心学习,哈哈,也祝大家新年快乐,武汉加油!

对于反射的专业概念阐述我就不粘贴了哈,直接写体会。

为什么要在字段上用注解呢?

这是让我想去研究反射的缘由,在对于注册页面的Form表单所对应的.java文件中,一个字段上可能会有一个甚至多个注解(非空、位数限制等等),就拿注册表单上的用户名userName来说,这个字段要求不可为空,而且应该字数处于6-12位长,代码往往是这样的:

/**
 * 注册表单
 * 
 * @author 罗玺
 */
public class RegistForm {

	/**
	 * 用户名
	 */
	@MyNotEmpty
	@MySize(min=6,max=12)
	private String userName;

	public String getUserName() {
		return userName;
	}

	public void setUserName(String userName) {
		this.userName = userName;
	}

}

到这里可以说,为什么用注解? 像我这种实习生,又菜又爱乱写,一个非空我会想在前台加JS并且在后台对这些字段值也做一次值的判断,这样的话会导致我的代码提上去之后跟其他有代码规范的大佬们显得格格不入,到底能不能限制住这个字段也需要另外去测试,所以干脆弄成注解,我们菜鸟只管@就完事,对错都是写注解实现类的人负责,这样管理者又省事又放心对吧? 但是,我虽为实习生,也有一颗想让大家用我代码的心,所以。。。

我们自己利用反射实现这个MySize(min=,max=12)注解!

首先,先创建这个注解

public @interface MyNotEmpty {
	
	//最小值
	int min();
	
	//最大值
	int max();
}

加上之后我们的form小demo就成了这样

public class RegistForm {

	/**
	 * 用户名
	 */
	@MyNotEmpty(min=6,max=12)
	private String userName;

	public String getUserName() {
		return userName;
	}

	public void setUserName(String userName) {
		this.userName = userName;
	}

}

怎么样,到这儿看起来是不是跟咱们平时给自己表单打注解看起来一模一样啦?

但是,只到这就能让你的注解起到检查字段的目的了吗?拿脚想都知道得有实现类呀! 那么开始吧

现在来创建一个实现类

public class Demo {
	public static void main(String[] args) throws Exception{
		
		//传进表单
		RegistForm registForm = new RegistForm();
		
		//表单已被用户输入了 123456 点了提交
		registForm.setUserName("123456");
		
		//反射不管三七二十一 先搞他字节码
		Class formClass = RegistForm.class;
		
		//获得字段
		Field field = formClass.getDeclaredField("userName");
		
		//设置字段可读
		field.setAccessible(true);
		
		//获取该字段上的注解
		MySize mySize = field.getDeclaredAnnotation(MySize.class);
		
		System.out.println(mySize);
	}
}

打印一下控制台:

@Regist.MySize(min=6, max=12)

到这儿也就知道了可能框架就是这样得到的限制条件,当然这个例子就是个意思,是我自己这么单纯认为的哈哈,继续实现吧:

//继续实现 获取值 这里需将表单对象传进来,以此获取userName的值
		System.out.println((String)field.get(registForm));

现在打印就能得到两个主角:

@Regist.MySize(min=6, max=12)
123456

有了这个字段的值,有了注解传来的两个条件,现在只需要在接下来的代码里做判断就好啦,这里将用户名赋值123,输出错误:

public class Demo {
	public static void main(String[] args) throws Exception{
		
		//传进表单
		RegistForm registForm = new RegistForm();
		
		//表单已被用户输入了 123456 点了提交
		registForm.setUserName("123");
		
		//反射不管三七二十一 先搞他字节码
		Class formClass = RegistForm.class;
		
		//获得字段
		Field field = formClass.getDeclaredField("userName");
		
		//设置字段可读
		field.setAccessible(true);
		
		//获取该字段上的注解
		MySize mySize = field.getDeclaredAnnotation(MySize.class);
		 
		//继续实现 获取值 这里需将表单对象传进来,以此获取userName的值
		String userName = (String)field.get(registForm);
		
		if(userName.length() < mySize.min() || userName.length() > mySize.max()){
			System.out.println("返回报错信息! {用户名应该大于"+mySize.min()+"位,小于"+mySize.max()+"位}");
		}else{
			System.out.println("输入合法!");
		}
	}
}

控制台:

返回报错信息! {用户名应该大于6位,小于12位}

总结

自己的一些体会,写的不好,但是总算能将自己的理解描述出来,希望各位看客能多提错误,也希望自己以后可以将学习的体会都手打一遍发到博客上,这样也有利于自己的理解,有错误的话也可以被大家批评,谢谢大家!

©️2020 CSDN 皮肤主题: 1024 设计师:上身试试 返回首页