Java反射 - 通过反射获取注解的值
一个ORM例子
定义注解
1 | (ElementType.TYPE) |
实体类
1 | "user") ( |
获取注解进行处理
1 | public class ReflectAnno { |
1 | @Target(ElementType.TYPE) |
1 | @Table("user") |
1 | public class ReflectAnno { |
1 | public class ReflectGet { |
1 | public class ReflectUse { |
注意:
invoke
执行获得的类的方法:(需要执行的对象,形参…)set
对类的属性进行赋值:(需要赋值的对象,形参)private
,可以通过设置setAccessible(true)
来访问。Java是静态语言。
反射机制的引入,使Java能在执行期借助反射API获取任何类的内部信息,并能直接操作任何类的内部属性及方法。
正常方法:
引入’包类’名称 -> new实例化 -> 获得实例化对象
反射方法:
实例化对象 -> getClass()
方法 -> 得到’包类’名称
优点:实现动态创建对象和编译。
缺点:性能有影响。
1 | Class c1 = Class.forName("com.edlison.design.v1.reflection.User"); |
Class
对象Class
对象中1 | Class c1 = person.getClass(); |
forName
获得1 | Class c2=Class.forName("com.edlison.design.v1.reflection.Student"); |
1 | Class c3 = Student.class; |
1 | Class c4 = Integer.TYPE; |
1 | Class c5 = Student.class.getSuperclass(); |
加载 -> 链接 -> 初始化
结合JVM进行理解。
类加载器是用来把类(Class)装载进内存的,JVM自顶向下定义了如下加载器。
jre/lib/ext
下的Jar包的导入。java --classpath
所指目录下类与Jar包的导入。系统类加载器 -父类> 扩展类加载器 -父类> 引导类加载器
可以依次根据ClassLoader.getParent()
取得其父类。
注意:
Java内置了几个元注解
@Target
定义了作用域,可以使用的范围。@Retention
定义了注解的生命周期。@Document
定义注解将被包含在JavaDoc中。@Inherited
说明子类可以继承父类的注解。注解内可以规定要传哪些值。
1 | @Target(value = {ElementType.METHOD, ElementType.TYPE}) |
value
对应的可以不用写value = ""
, 可以直接传值。default
默认则可以不传值。注解可以添加在package, class, method, field上,相当于给他们添加了额外的信息,我们可以通过反射机制编程来实现对这些元数据的访问。
![image-20210202095609829](/Users/edlison/Library/Application Support/typora-user-images/image-20210202095609829.png)
代理模式使用组合(作为数据成员)的方式,将Host
传入Proxy
。
如果使用继承(extends)的方式,灵活度降低。