反射机制
2021/4/18 18:55:49
本文主要是介绍反射机制,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
反射机制
反射机制的概述
1:反射作用:
通过java语言的反射机制操作字节码文件;
优点类似于***(可以读和修改字节码文件);
通过反射机制可以操作代码片段。
2:反射机制的相关类在哪个包下?
java.lang.rflect.*;
3:反射机制相关的重要的类有哪些?
java.lang.Class; (代表字节码,代码一个类型,表示整个类)
java.lang.reflect.Method;(代表字节码中方法字节码)
java.lang.reflect.Constrcuctor;(代表字节码中构造方法字节码)
java.lang.reflect.Fild;(代表字节码中属性字节码)
代码实现!!
packagecom.bjpowernode.java.threadsafe; //整个class01为Class publicclassUser01 { //Field intno; //Constructor publicUser01() { } publicUser01(intno) { this.no=no; } //Method publicintgetNo() { returnno; } publicvoidsetNo(intno) { this.no=no; } }
2:获取Class的三种方式(Class.forName(完整类名包名))
2.1:Class.forName
静态方法,方法是参数是一个完整类名,字符串需要完整类名,完整类名必带java.lang不能省略。
Class c = Class.forName("java.lang.String"); c为String.Class文件
Class c1 = Class.forName("java.lang.Date") c1为Date
2.2:第二种方式 (引用.getClass)
java中任何一个对象都有一个方法:get.class();
String s = "abc";
Class x = s.getClass(); x代表String.Class字节码文件,x是String类型
Date time = new Date();
Class y = time.getClass; 内存地址一样,指向方法区的字节码
2.3:第三种方法(数剧类型.class)
java语言任何一种类型,包括基本数据类型都有.classs属性
Class z = String.class; z代表String类型
Class k = Date.class; k代表Date类型
3:通过反射实例化对象
重点:通过Class的newInstance()方法实例化对象
newInstance()方法内部实际上调用了无参构造方法,必须保证无参构造存在才可能。
代码实现:
//创建对象 User01user01=newUser01(); System.out.println(user01); //使用反射机制方式创建对象 try { Classc=Class.forName("com.bjpowernode.java.threadsafe.User01"); //c为User类型 //newInstance()这个方法会调用User这个类的无参构造方法,完成对象创建 //重点:newInstance()调用的是无参构造,必须保证无参是存在的 Objectobj=c.newInstance(); //obj创建的是User类的对象 System.out.println(obj); } catch (InstantiationExceptione) { e.printStackTrace(); } catch (IllegalAccessExceptione) { e.printStackTrace(); } catch (ClassNotFoundExceptione) { e.printStackTrace(); }
4:通过属性配置文件实例化对象.
重点:代码灵活,代码不需要改动,可以修改配置文件,配置文件修改之后可以创建不同的实例对象
代码实现!!!(通过io的properties连用)
publiccla***rflectTest03 { publicstaticvoidmain(String[] args) throwsIOException, ClassNotFoundException, InstantiationException, IllegalAccessException { //通过io读取classinfo.properties文件 FileReaderreader=newFileReader("DuoXianCheng/classinfo.properties"); //创建属性类对象Map Propertiesproperties=newProperties(); //加载,调用Properties中load方法将文件加载到Map文件中 properties.load(reader); //文件中的数据会通过管道加载到Map中 //关闭流 reader.close(); //通过key获取value StringclassName=properties.getProperty("className"); //通过反射机制实例化对象 Classc=Class.forName(className); Objectobj =c.newInstance(); System.out.println(obj); } }
5:只让静态代码块执行可用forName
重点:只希望静态代码块执行可使用Class.forName("完整类名")
这个方法执行会导致类加载,类加载是静态代码块执行!!
代码实现!!!
publiccla***eflectTest04 { publicstaticvoidmain(String[] args) { try { Class.forName("com.bjpowernode.reflect.MyClass"); } catch (ClassNotFoundExceptione) { e.printStackTrace(); } } } classMyClass { //静态代码块在类加载是操作,并且只执行一次 static { System.out.println("努力学习!"); } }
6:获取类路径下文件的绝对路径!!
怎么获取一个文件的绝对路径,以下讲解那个方式通用的,但必须在src类路径下。
//什么是类路径?方式在src下都是类路径 //src是类的根路径 /*解释: Thread.currentThread() 当前线程对象 getContextClassLoader() 线程对象方法,可以获取当前线程的类加载对象 getResource(); 这是类加载对象的方法,当前线程的类加载默认从类的根路径下加载资源
关于代码实现!!
Stringpath=Thread.currentThread().getContextClassLoader().getResource("classinfo3.properties").getPath(); ///D:/Users/Administrator/IdeaProjects/untitled1/out/production/DuoXianCheng/classinfo3.properties System.out.println(path); //获取绝对路径
7:以流形式直接返回
代码实现!!
publicclassIoProertiesTest { publicstaticvoidmain(String[] args) throwsIOException { //获取一个文件的绝对路径 /*String path = Thread.currentThread().getContextClassLoader() .getResource("classinfo3.properties").getPath(); FileReader reader = new FileReader(path);*/ //直接以流的形式返回 InputStreamreader= Thread.currentThread().getContextClassLoader() .getResourceAsStream("classinfo3.properties"); Propertiesproperties=newProperties(); properties.load(reader); reader.close(); //通过key获取value StringclassName=properties.getProperty("className"); System.out.println(className); } }
8:资源绑定器(给属性文件专属)
只能绑定xxx.properties文件,并且这个文件必须在类路径下,文件扩展名为properties并写路径时,路径后面扩展名不能写。
代码实现:
publicclassZiYuanBangDingQ { publicstaticvoidmain(String[] args) { ResourceBundlebundle=ResourceBundle.getBundle("classinfo3"); //.properties扩展名不能写 StringclassName=bundle.getString("className"); System.out.println(className); } }
这篇关于反射机制的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-05-19永别了,微服务架构!
- 2024-05-15鸿蒙生态设备数量超8亿台
- 2024-05-13TiDB + ES:转转业财系统亿级数据存储优化实践
- 2024-05-09“2024鸿蒙零基础快速实战-仿抖音App开发(ArkTS版)”实战课程已上线
- 2024-05-09聊聊如何通过arthas-tunnel-server来远程管理所有需要arthas监控的应用
- 2024-05-09log4j2这么配就对了
- 2024-05-09nginx修改Content-Type
- 2024-05-09Redis多数据源,看这篇就够了
- 2024-05-09Google Chrome驱动程序 124.0.6367.62(正式版本)去哪下载?
- 2024-05-09有没有大佬知道这种数据应该怎么抓取呀?