简化代码,使逻辑更加清晰。如项目中的权限验证功能,我们可以自定义权限注解更好的把控接口的访问权限。
因为这样别人调用你写的注解就可以实现一些功能,方便别人,就像你用别人注解就可以不用做一些xml配置一样
猜测是你@Column注解的
@Retention(RetentionPolicy.RUNTIME)
设置错了
确实是的
第36行 的 方法错了c.getFields() 应该是 getDeclaredFields();
这位同学看的很仔细,我也发现,的确没有这个方法。没关系,大家都知道原理,就可以。感谢
是不同的类型,而且所占用的空间字符也不同。
只是个类名,并不是Servlet的过滤器!是自定义的,起到见名知意的作用就可以,当然最好别跟常用框架的类名,接口名一样。省得误解
才发现这个注解的值就是数据库里面变量的名字
fieldName是指类的一个属性名,columnName是相应属性的注解内容
让你大致了解 注解的作用,
你要在spring的配置文件里说明你是用注解的方式的,这东西就是自动帮你实例化了对象,
<!-- 注解扫描的位置 spring --> <context:component-scan base-package="*" />
*表示扫描的是所用包,可以改
table 好像是自己定义的 有个Table.java文件
不一定,都要看个人能力
用了一个子查询,把原来的字符串拼接成 in('liu@163.com','zhang@gmail.com','hdjh@126.com')
针对老师代码来说:
单从老师的代码上确实和你说的差不多!
其实不知道你有没有发现,老师的本意是Column注解的值,是表示数据库中表的字段的,如果数据库中的表按照这个意思来创建的,那么最后生成的sql语句是有问题的。如:userName的用@Column("user_name")意味着数据库表中字段名应该是user_name。
如果我们做一个假设,需要做映射的类满足java类名 ==(或者做固定的转换,如首字母小写) 数据库中表名, java字段名 ==(或者做固定的转换,如首字母小写,在驼峰字母转成“_ ”+ "小写字母") 数据库中表的字段名,那完全是可以用反射实现的,这样是所谓的约定。
但是我们学习,还是不要只局限于此,需要自己多思考!
针对注解的作用来说:
注解的作用主要在于标记、统一处理(如AOP面向切面编程)、去配置化(也可以认为将配置转成了代码)。
要让注解最后起作用的话,不同类型的注解需要借助不同的东西。这里主要说说运行时注解!运行时注解如果要起作用的话,是需要借助java的反射机制。大致思路:通过反射获取相应的注解信息(含注解的成员值),根据注解的值进行相对应的业务处理(实际业务需求,视情况而定)。如:定义一个@log注解(作用于方法),有一个参数logTime(有after和before两个值),那么通过反射机制获取包含@log注解后,判断logTime是before则在方法调用前输出日志,如果是after则在方法调用完成后输出日志!这其实应该是老师代码的本意,只不过可能一时疏忽,搞错了!
在括号里方法名后边,在填一个实参,对应该方法的类型就行了
这个类对象用于承载从数据库查出来的数据
Object fieldValue = null; //定义一个object变量用语存储对象的属性值 try { Method getMethod = c.getMethod(getMethodName); //根据方法名字获得这个方法 fieldValue = getMethod.invoke(f);//执行f对象的方法名为getMethodName的方法。 } catch (Exception e) { e.printStackTrace();
其实,这段代码要做的就是,根据属性名称获取对象的属性值。就是你知道了对象的属性名,但是要获取这个对象的值。
所以,你直接调用对象的get方法就可以得到对象的属性值。但是因为属性名称是个变量,所以这时候就要通过反射来实现了,具体怎么实现呢?
1:根据属性名称,构造属性方法名。比如属性名是namecode他的get方法就是getNamecode(){......},所以方法名就是getNamecode,
2:根据方法的名称,获取这个方法对象Method getMethod = c.getMethod(getMethodName);
3:这个方法的方法对象你获得了,就可以执行这个方法了,具体它要调用一个invoke的方法,具体invoke做了什么你可以去看源码,也可以自己了解,我可以告诉你,这句代码:fieldValue = getMethod.invoke(f);
它相当于是f对象调用它的获取这个属性的属性值的get方法。就是执行你第2部获取到的那个方法。
这时候,就得到了这个对象的已知属性名称的属性值。
获取它们的类类型
你把方法写到main函数里了 这应该放到类里
不用加,加了反而不对,加分号是java的习惯,在数据库执行查询的时候不用加分号,只是我们直接在数据库查询的时候加分号数据库默认不算错。但如果通过jdbc或其他工具连接数据库执行查询的话有分号就算是错的
可以在程序运行时才加载数据
Retention表示作用范围,SOURCE一般用于标记,比如javadoc,或为了其他人易于理解你的程序,如@Override。class范围的说起来有点复杂,当程序使用编译好的class文件时,需要用类加载器把class文件加载到内存中,class文件中的东西不是字节码,class文件里面的东西由类加载器加载到内存中去,类加载器在加载class文件时,会对class文件里面的东西进行处理,如安全检查,处理完以后得到的最终在内存中的二进制的东西才是字节码,类加载器在把class文件加载到内存中时也有转换,转换时是否把class文件中的注解保留下来?class范围不保留,runtime则保留