反射机制

反射机制的概述

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为ClasspublicclassUser01 {    //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.propertiesSystem.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);    }}


©著作权归作者所有:来自51CTO博客作者mb6066e165689bf的原创作品,如需转载,请注明出处,否则将追究法律责任

更多相关文章

  1. 利用 OpenRestry 实现负载均衡、限流功能
  2. 这段危险代码90%的人都写过!
  3. 【故障处理】ORA-12545: Connect failed because target host or
  4. Spring初使用:使用Spring创建对象
  5. Zerodium公开Tor浏览器0day代码执行漏洞 被喷“不负责任”
  6. Servlet监听器使用实例(提高程序运行速度)
  7. Kubernetes 并不适合大多数团队
  8. 在k8s集群部署SonarQube
  9. Java面试题,Java面试题及答案,2021最新的,都整理好了

随机推荐

  1. Android之几个dos小命令
  2. Unity与Android交互-案例演示接入穿山甲
  3. Android init 启动过程分析
  4. android intent和intent action大全
  5. 关于 Android(安卓)Studio 鼠标中键的一
  6. Android任务栈TaskStack
  7. Android(安卓)UI开发第二十篇——仿launc
  8. andriod线性布局部分用法
  9. android通过蓝牙连接打印机实现格式化打
  10. Android adb的常用命令