反射与注解

反射是框架设计的灵魂
反射:将类的各个组成部分封装为其他对象,这就是反射机制
三种获得类的Class对象的方法
Class cls1 = Class.forName(“domain.Person”);
将字节码加载进内存,返回class对象,多用于配置文件,读取文件,加载类
Class cls2 = Person.class;
通过类名的属性class获得,多用于参数的传递
Person p = new Person();
Class cls3 = p.getClass();
调用类的getClass方法获得,多用于对象的获取字节码文件

运行后发现,cls1、2、3都是相同的
结论:同一个字节码文件(*.class)在一次程序运行过程中,只会被加载一次,无论是通过哪一种方式获得的class对象都是同一个

还有一个非常重要的知识,快速写类的构造方法和基础成员方法,按住alt+shift+s,然后分别是o、c、r按键

2020年10月13日
获取成员变量:
getField(String name)
getDeclareField(String name)
getDeclareFields(),可以获得所有的成员变量,甚至包括私有的
getFields(),只可以获取共有的成员变量
获取构造方法:
getConstructors(),其他三个同上
可以用于创建对象,示例:
Class personClass = Class.forName(“domain.Person”);
Constructor constructor1 = personClass.getConstructor(int.class, String.class);//通过参数列表来进行区分
Object person1 = constructor1.newInstance(1, “hjd”);

获取成员方法:
getMethods(),其他三个同上

invoke方法,使用需要调用实际对象和参数列表,用于调用方法,示例:
Method eat_method = personClass.getMethod(“eat”, String class);
Person p = new Person();
eat_method.invoke(p, “饭”);

getName:获取方法的名称,示例:
Method[] methods = personClass.getMethods();
for(Method method : methods){
String name = method.getName();
System.out.println(name);
}

获取类名:
getName()
String className = personclass.getName();

示例实战(很有难度,但是收获颇多):
public static void main(String[] args) throws Exception{
//创建properties对象
Properties pro = new Properties();
获取class目录下面的配置文件
ClassLoader classLoader = Main.class.getClassLoader();
InputStream is = classLoader.getResourceAsStream(“pro.properties”);
pro.load(is);
//获取配置文件中定义的数据
String className = pro.getProperty(“className”);
String methodName = pro.getProperty(“methodName”);
//加载该类进内存
Class cls = Class.forName(className);
//创建对象
Object obj = cls.newInstance();
//获取方法对象
Method method = cls.getMethod(methodName);
//执行方法
method.invoke(obj);
}
配置文件(pro.properties)(可以改动配置文件,而不需要直接去修改代码):
className=domain.Student
methodName=sleep

2020年10月14日
注释:用文字描述程序,给程序员看的
注解:说明程序的,给计算机看的,是JDK1.5之后的新特性,
作用分类:
1.编写文档,通过代码里标识的注解生成文档(生成文档doc)
2.代码分析:通过代码里标识的注解对代码进行分析(使用反射)
3.编译检查:通过代码里表示的注解让编译器可以实现基本的编译检查(比如Override)

3很容易理解,比如如果重写父类方法,需要使用@Override注解
1的话,在命令行中使用javadoc java文件名,这样可以直接生成一个关于Java类的文档,并且这个生成过程是会识别注解的,识别注解,得到更正规的说明文档

2是重点!
Java基本的内置注解:
@Override:检测被该注解标注的方法是否是继承自父类(接口)的,
@Depercated:该注解标记的内容已过时,用于产品更新,向下兼容
@suppressWarnings:压制警告,将IDE乱七八糟的警告全部消除,需要传参数,一般传递参数all,suppressWarnings(“all”)

自定义注解:
格式:
元注解
public @interface 注解名称{}
编译再反编译:
public interface MyAnno extends java.lang.annotation.Annotation {}
注解的本质上就是一个接口,该接口默认继承Annotation接口
属性:接口中可以定义的抽象方法
要求:
1.返回的数据类型
基本数据类型
String
枚举
以上类型的数组
2.使用时需要给属性赋值
如果default,可以不用赋值,直接默认
如果叫做value,可以省略value,直接写值

元注解:用于描述注解的注解
target:描述注解能够作用的位置
ElementType:Filed、Type、Method等等
retention:描述注解被保留的阶段
runtime等等
document:描述注解是否被抽取到api文档中
inherited:描述注解是否被子类继承

注解有什么用?
获取注解定义的属性值
用于替换配置文件,和配置文件达到相同的效果
1.获取注解定义位置的对象
2.获取指定的注解:getAnnotation(class)
3.调用注解中的抽象方法获取配置的属性值

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值