java进阶-day10

本文深入探讨了Java中的反射机制,包括如何通过Class、Constructor、Method和Field操作字节码文件。讲解了Class.forName()、对象实例化、获取类路径、资源加载以及属性和方法的获取。此外,还介绍了类加载器的工作原理,如启动类加载器、扩展类加载器和应用类加载器的双亲委派模型。文章还提到了可变长度参数的使用和注解的定义、元注解及其在代码中的应用。
摘要由CSDN通过智能技术生成

反射机制

  1. 通过反射机制,可以操作字节码文件(读和改)。
  2. 在java.lang.reflect包下。
  3. Class:整个这个class文件
  4. Construcrot:字节码文件中的构造方法
  5. Method:字节文件中的方法
  6. Field:字节码文件中的属性
  7. 获取class文件第一:Class c=Class.forName(“java.lang.String”);这个方法是一个静态方法,参数是一个字符串,字符串需要是一个完整的类名。完整类名必须带有包名。
  8. 获取class文件第二:String s=“abc”;Class x=s.getClass();这个方法返回了一个class文件,就是String.calss文件。
  9. 获取class文件第三:java语言中的任何一种类型都有class属性;Class z=String.class。
  10. 当拿到一个Class类的一个引用c后,可以调用这个引用的newInstance方法,返回的是一个Object类,完成对象的创建,底层是调用了c这个类的无参构造方法,实际上创建的对象还是属于c这个类。这样也是创建对象。
  11. 如果只是希望某一个类的静态代码快执行,不希望其他程序执行,可以采用Class.foName(“java.reflect.MyClass”)的方式,这个方法的执行会导致类加载,而静态代码块只有在类加载的时候才会执行。
  12. src文件下的就叫类路径。
  13. 当类和文件都在src路径下的时候,要获取这个文件的绝对路径:String path =Thread.currentThread().getContextClassLoader().getResource(“className.properties”).getPath();此时这个path就是这个文件的绝对路径。
  14. 或者直接可以以流的形式返回 FileReader reader=Thread.currentThread().getContextClassLoader().getResourceAsStream(“classname.properties”);
  15. java.util包下提供了一个资源绑定器,遍与获取属性配置文件中的内容,这个时候文件必须放到类路径下。只能绑定.properties的文件。ResourceBundle bundle=ResourceBundle.getBundle(“className”); String className=bundle.getString(“key”);
  16. 获取类中的所有属性(field);先把这个类拿到,然后调用这个类中的getfields()方法,返回的是一个数组,而且这个方法只能拿到public的属性。或者调用这个类中的getDeclaredFields()方法,拿到所有的属性。然后想拿属性的名字就调用getName()方法。
  17. 拿到一个类后也可以得出它的类名:getName()方法得到是完整的类名,getSimpleName()拿到的是简类名。
  18. 拿到这个属性后也可以拿到这个属性的类型,调用getType()方法,返回的是一个class类型,然后用这个class类型的值去调用getName就可以拿到这个属性的类型。
  19. 也可以拿到这个属性的修饰符列表,getModifiers(),因为修饰符列表可以是多个,所以是s。返回的是一个int类型的,每一个修饰符列表所对应的数字是不同的,可以用Modifier类中的静态方法toString()方法区转换成这个修饰符列表,返回的是一个String。参数是所对应的int。
  20. 反射机制具有很强的通用性。
  21. 获取父类,获取当前类之后调用getSuperclass()方法。
  22. 获取接口,返回的是一个数组Class[] interfaces,那个类调用getInterfaces()方法。

类加载器

  1. 专门负责加载类的命令/工具。
  2. 代码在开始执行之前,会将所需要的类全部加载到jvm当中,通过类加载器加载。
  3. 启动类加载器专门加载:c:\java\jdk 1.8.0\jre\lib\rt.jar中的class文件,这里面都是jdk中最核心的类库。
  4. 如果通过启动类加载器加载不到的类的时候,会通过扩展类加载器加载。扩展类加载器专门加载:c:\java\jdk 1.8.0\jre\lib\ext*.jar中的class文件。
  5. 如果扩展类加载器也没有找到,那么应用类加载器会进行加载,应用类加载器专门加载:classpath中的jar包。环境变量。
  6. 双亲委派:启动类是父,拓展类是母,只有父和母都加载不到的时候,才会去应用类加载器里面加载。

可变长度参数

  1. 类型后面加三个点加名字。
  2. 也就是参数可以无限长。只能出现一个,而且出现在最后一个。
  3. 其实相当于一个数组。有length属性。

注解

  1. Annotation是一个引用数据类型,编译之后也生成.class文件。
  2. 修饰符列表 @interface 注释类型名{ };
  3. 注释的使用:@注释名
  4. @Override这个注解只能注解方法,而且必须是重写父类的方法,在编译阶段时检测的。
  5. @Target注解用来标注注解类型,标记那个注解只能出现在哪些位置上,例如方法,类等。称为元注解。
  6. @Retention注解用来标注注解类型,用来标记那个注解最终保存在哪里。source表示保存在java源文件中,class表示保存在class文件中,runtime标志保存在class文件中并且可以被反射机制所读取。
  7. @Deprecated表示注解某个方法或类已经过时了。
  8. 注解中可以定义属性,但是有属性的注解不能直接调用,必须@Deprecated (属性名=值)。或者在属性后面加一个default 后面加了默认值。
  9. 如果一个注解的只有一个属性而且属性名叫value的话,给它赋值的时候属性名可以不写直接赋值。
    10.如果注解中的属性是一个数组,而且给它赋值的时候数组里面只有一个元素,那么大括号可以省略。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

努力打破规则的小雄

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值