范文健康探索娱乐情感热点
投稿投诉
热点动态
科技财经
情感日志
励志美文
娱乐时尚
游戏搞笑
探索旅游
历史星座
健康养生
美丽育儿
范文作文
教案论文

Java中的反射

  类加载器(1)类的加载
  当我们的程序在运行后,第一次使用某个类的时候,会将此类的class文件读取到内存,并将此类
  的所有信息存储到一个Class对象中。
  说明:
  a.图中的Class对象是指:java.lang.Class类的对象,此类由Java类库提供,专门用于存储类的信息。
  b.我们程序中可以通过:"类名.class",或者"对象.getClass()"方法获取这个Class对象(2)类的加载时机
  a.创建类的实例。
  b.调用类的静态变量,或者为静态变量赋值。
  c.调用类的静态方法。
  d.使用反射方式来强制创建某个类或接口对应的java.lang.Class对象。
  e.初始化某个类的子类。
  f.直接使用java.exe命令来运行某个主类。
  以上六种情况的任何一种,都可以导致JVM将一个类加载到方法区。(3)类加载器
  类加载器:是负责将磁盘上的某个class文件读取到内存并生成Class的对象。
  Java中有三种类加载器,它们分别用于加载不同种类的class:
  a.启动类加载器(Bootstrap ClassLoader):用于加载系统类库bin目录下的class,例如:rt.jar。
  b.扩展类加载器(Extension ClassLoader):用于加载扩展类库libext目录下的class。
  c.应用程序类加载器(Application ClassLoader):用于加载我们自定义类的加载器。public class Test{ public static void main(String[] args) {     System.out.println(Test.class.getClassLoader());//sun.misc.Launcher$AppClassLoader     System.out.println(String.class.getClassLoader());//null(API中说明:一些实现 可能使用null来表示引导类加载器。 如果此类由引导类加载器加载,则此方法将在此类实现中返回null。 )     } }(4)双亲委派机制
  上图展示了"类加载器"的层次关系,这种关系称为类加载器的"双亲委派模型":
  a."双亲委派模型"中,除了顶层的启动类加载器外,其余的类加载器都应当有自己的"父级类加载器"。
  b.这种关系不是通过"继承"实现的,通常是通过"组合"实现的。通过"组合"来表示父级类加载器。
  c."双亲委派模型"的工作过程:
  i. 某个"类加载器"收到类加载的请求,它首先不会尝试自己去加载这个类,而是把请求交给父
  级类加载器。
  ii.因此,所有的类加载的请求最终都会传送到顶层的"启动类加载器"中。
  iii.如果"父级类加载器"无法加载这个类,然后子级类加载器再去加载。(5)双亲委派机制的好处
  双亲委派机制的一个显而易见的好处是:Java的类随着它的类加载器一起具备了一种带有优先级的层次
  关系。例如:java.lang.Object。它存放在rt.jar中。无论哪一个类加载器要加载这个类,最终都是委派
  给处于顶端的"启动类加载器"进行加载,因此java.lang.Object类在程序的各种类加载器环境中都是同一
  个类。
  相反,如果没有"双亲委派机制",如果用户自己编写了一个java.lang.Object,那么当我们编写其它类
  时,这种隐式的继承使用的将会是用户自己编写的java.lang.Object类,那将变得一片混乱。反射的概述(1)反射的引入
  问题:IDEA中的对象是怎么知道类有哪些属性,哪些方法的呢?
  答:通过反射技术对象类进行了解剖得到了类的所有成员。(2)反射的概念
  反射是一种机制,利用该机制可以在程序运行过程中对类进行解剖并操作类中的所有成员(成员变量,成员方 法,构造方法)。(3)使用反射操作类成员的前提
  要获得该类字节码文件对象,就是Class对象。(4)反射在实际开发中的应用
  a.开发IDEA(集成开发环境),比如IDEA,Eclipse
  b.各种框架的设计和学习 比如Spring,Mybaits....Class对象的获取方式(1)三种获取方式
  方式1: 通过类名.class获得
  方式2:通过对象名.getClass()方法获得
  方式3:通过Class类的静态方法获得: static Class forName("类全名")
  每一个类的Class对象都只有一个。
  示例代码:package com.test.code.reflex;  public class Student { }  public class Demo01 {     public static void main(String[] args) throws ClassNotFoundException {         // 获得Student类对应的Class对象         Class c1 = Student.class;           // 创建学生对象         Student stu = new Student();         Class<? extends Student> c2 = stu.getClass();         System.out.println(c1 == c2);          // 通过Class类的静态方法获得: static Class forName("类全名")         Class<?> c3 = Class.forName("com.test.code.reflex.Student");         System.out.println(c1 == c3);         System.out.println(c2 == c3);      } }
  Demo01运行结果:
  (2)Class类常用方法String getSimpleName(); 获得类名字符串:类名  String getName(); 获得类全名:包名+类名  T newInstance() ; 创建Class对象关联类的对象
  示例代码:public class Demo02 {     public static void main(String[] args) throws IllegalAccessException, InstantiationException {         // 获得Class对象         Class c = Student.class;          // 获得类名字符串:类名         System.out.println(c.getSimpleName());          // 获得类全名:包名 + 类名         System.out.println(c.getName());          // 创建对象         Student stu = (Student)c.newInstance();         System.out.println(stu);     } }
  Demo02运行结果:
  4.反射之操作构造方法(1)Constructor类概述
  反射之操作构造方法的目的:获得Constructor对象来创建类的对象。
  Constructor类概述:类中的每一个构造方法都是一个Constructor类的对象(2)Class类中与Constructor相关的方法
  1. Constructor getConstructor(Class... parameterTypes)
  * 根据参数类型获得对应的Constructor对象。
  * 只能获得public修饰的构造方法
  2. Constructor getDeclaredConstructor(Class... parameterTypes)
  * 根据参数类型获得对应的Constructor对象
  * 可以是public、protected、(默认)、private修饰符的构造方法。
  3. Constructor[] getConstructors()
  * 获得类中的所有构造方法对象,只能获得public的
  4. Constructor[] getDeclaredConstructors()
  * 获得类中的所有构造方法对象
  * 可以是public、protected、(默认)、private修饰符的构造方法。(3)Constructor对象常用方法
  1. T newInstance(Object... initargs)"—— 根据指定的参数创建对象
  2. void setAccessible(true) 设置"暴力反射"——是否取消权限检查,true取消权限检查,false表示不取消
  示例代码:public class Student {      private String name;     private String sex;     private int age;      //公有构造方法     public Student(String name, String sex, int age) {         this.name = name;         this.sex = sex;         this.age = age;     }      //私有构造方法     private Student(String name, String sex) {         this.name = name;         this.sex = sex;     }  }public class Demo03 {      /**      * Constructor[] getConstructors()      *      获得类中的所有构造方法对象,只能获得public的      * Constructor[] getDeclaredConstructors()      *      获得类中的所有构造方法,包括private修饰的      */     @Test     public void test03(){         // 获得Class对象         Class c = Student.class;          // 获得类中的所有构造方法对象,只能是public修饰的         Constructor<?>[] cons_one = c.getConstructors();         for (Constructor<?> con : cons_one) {             System.out.println(con);         }          System.out.println("--------------------------------");          // 获取类中所有的构造方法,包括public、protected、(默认)、private的         Constructor<?>[] cons_two = c.getDeclaredConstructors();         for (Constructor<?> con : cons_two) {             System.out.println(con);         }      }      /**      * Constructor getDeclaredConstructor(Class... parameterTypes)      *      根据参数类型获得对应的Constructor对象      */     @Test     public void test02() throws Exception {         // 获得Class对象         Class c = Student.class;          // 获得两个参数构造方法对象         Constructor con = c.getDeclaredConstructor(String.class, String.class);         // 取消权限检查(暴力反射)         con.setAccessible(true);         // 根据构造方法创建对象         Student stu = con.newInstance("liuyifei", "女");         System.out.println(stu);      }      /**      * Constructor getConstructor(Class... parameterTypes)      *      根据参数类型获得对应的Constructor对象      */     @Test     public void test01() throws Exception {         // 获得Class对象         Class c = Student.class;          // 获得无参数构造方法对象 注意:记得在Student类中加无参构造方法,不然会报错         Constructor con = c.getConstructor();          // 根据构造方法创建对象         Student student = con.newInstance();         System.out.println(student);          // 获得有参数的构造方法对象         Constructor con2 = c.getConstructor(String.class, String.class, int.class);         // 创建对象         Student stu2 = con2.newInstance("jack", "男", 18);         System.out.println(stu2);     }  }5.反射之操作成员方法(1)Method类概述
  反射之操作成员方法的目的:操作Method对象来调用成员方法
  Method类概述:每一个成员方法都是一个Method类的对象。(2)Class类中与Method相关的方法
  * Method getMethod(String name,Class...args);
  根据方法名和参数类型获得对应的构造方法对象,只能获得public的
  * Method getDeclaredMethod(String name,Class...args);
  根据方法名和参数类型获得对应的构造方法对象,包括public、protected、(默认)、private的
  * Method[] getMethods();
  获得类中的所有成员方法对象,返回数组,只能获得public修饰的且包含父类的
  * Method[] getDeclaredMethods();
  获得类中的所有成员方法对象,返回数组,只获得本类的,包括public、protected、(默认)、 private的
  (3)Method对象常用方法
  * Object invoke(Object obj, Object... args)
  调用指定对象obj的该方法
  args:调用方法时传递的参数
  * void setAccessible(true)
  设置"暴力访问"——是否取消权限检查,true取消权限检查,false表示不取消
  示例代码:public class Demo04 {      /**      * Method[] getMethods();      * 获得类中的所有成员方法对象,返回数组,只能获得public修饰的且包含父类的      * Method[] getDeclaredMethods();      * 获得类中的所有成员方法对象,返回数组,只获得本类的,包含private修饰的      */     @Test     public void test03() {         // 获得Class对象         Class c = Student.class;          // 获得类中的所有成员方法对象,返回数据,只能获得public修饰的且包含父类的         // Method[] methods = c.getMethods();          // 获得类中的所有成员方法对象,返回数组,只获得本类的,包含private修饰的         Method[] methods = c.getDeclaredMethods();         for (Method method : methods) {             System.out.println(method);         }     }      /**      * Method getDeclaredMethod(String name,Class...args);      * 根据方法名和参数类型获得对应的构造方法对象,      */     @Test     public void test02() throws Exception {         // 获得Class对象         Class c = Student.class;          // 根据Class对象创建学生对象         Student stu = c.newInstance();         // 获得sleep方法对应的Method对象         Method m = c.getDeclaredMethod("sleep");         // 暴力反射         m.setAccessible(true);         // 通过m对象执行sleep方法         m.invoke(stu);     }      /**      * Method getMethod(String name,Class...args);      * 根据方法名和参数类型获得对应的构造方法对象,      */     @Test     public void test01() throws Exception {         // 获得Class对象         Class c = Student.class;          // 根据Class对象创建学生对象         Student stu = c.newInstance();  //        // 获得study方法对应的Method对象 //        Method m = c.getMethod("study"); //        // 通过m对象执行study方法 //        m.invoke(stu);          // 获得study方法对应的Method对象         Method m2 = c.getMethod("study", int.class);         // 通过m2对象执行study方法         m2.invoke(stu, 8);     }  }6.反射之操作成员变量(1)Field类概述
  反射之操作成员变量的目的 :通过Field对象给对应的成员变量赋值和取值
  Field类概述: 每一个成员变量都是一个Field类的对象。(2)Class类中与Field相关的方法
  Field getField(String name);
  根据成员变量名获得对应Field对象,只能获得public修饰
  Field getDeclaredField(String name);
  根据成员变量名获得对应Field对象,包括public、protected、(默认)、private的
  Field[] getFields();
  获得所有的成员变量对应的Field对象,只能获得public的
  Field[] getDeclaredFields();
  获得所有的成员变量对应的Field对象,包括public、protected、(默认)、private的(3)Field对象常用方法
  void set(Object obj, Object value)
  void setInt(Object obj, int i)
  void setLong(Object obj, long l)
  void setBoolean(Object obj, boolean z)
  void setDouble(Object obj, double d)
  Object get(Object obj)
  int getInt(Object obj)
  long getLong(Object obj)
  boolean getBoolean(Object ob)
  double getDouble(Object obj)
  void setAccessible(true); // 暴力反射,设置为可以直接访问私有类型的属性。
  Class getType(); // 获取属性的类型,返回Class对象。
  setXxx方法都是给对象obj的属性设置使用,针对不同的类型选取不同的方法。
  getXxx方法是获取对象obj对应的属性值的,针对不同的类型选取不同的方法。
  示例代码:public class Student {      public String name;     private String gender;      public String toString() {         return "Student [name = " + name + " , gender = " + gender + "]";     }  }public class Demo05 {      /**      * Field[] getFields();      * 获得所有的成员变量对应的Field对象,只能获得public的      * Field[] getDeclaredFields();      * 获得所有的成员变量对应的Field对象,包含private的      */     @Test     public void test02(){         // 获得Class对象         Class c = Student.class;          // 获得所有的成员变量对应的Field对象         // Field[] fields = c.getFields();          // 获得所有的成员变量对应的Field对象,包括private         Field[] fields = c.getDeclaredFields();         for (Field field : fields) {             System.out.println(field);         }      }      /**      * Field getField(String name);      *      根据成员变量名获得对应Field对象,只能获得public修饰      * Field getDeclaredField(String name);      *      根据成员变量名获得对应Field对象,包含private修饰的      */     @Test     public void test01() throws Exception {         // 获得Class对象         Class c = Student.class;          // 创建对象         Student stu = c.newInstance();          // 获得成员变量name对应的Field对象         Field f = c.getField("name");         // 给成员变量name赋值         // 给指定对象stu的name属性赋值为jack         f.set(stu,"jack");          // 获得指定对象stu成员变量name的值         System.out.println(f.get(stu)); // jack         //  获得成员变量的名字         System.out.println(f.getName()); //name          // 给成员变量gender赋值         // 获得成员变量gender对应的Field对象         Field f1 = c.getDeclaredField("gender");         // 暴力反射         f1.setAccessible(true);         // 给指定对象stu的gender属性赋值为男         f1.set(stu,"男");          System.out.println(stu);     }  }
  wx搜索"自律的西瓜L"

收评创业板指冲高回落涨0。16,信创概念重挫,教育板块逆势大涨金融界11月18日消息周五早盘A股高开,开盘后三大指数表现分化,沪指震荡走弱翻绿,创业板指冲高回落涨超1午后A股短暂上行后再度回落,沪指收跌再失3100点。截至收盘,沪指跌0。58似曾相识全球产业链向东南亚转移情况分析报告作者第一财经马鑫李嘉怡于舰前言当我们在各电商平台上搜索越南的商品时,包装轻简的越南河粉是从页面跳出来最多的品类。透明的越南春卷皮,各种香型瓶子形状似越南女孩子传统裙装的香水也会不断口臭其实很简单能点进去的基本都是口臭困扰的对那些因为各种情况变臭的人说口臭不是治不好,只是你没有找到口臭的核心!于七年治疗重度口臭的经验和心得以及众多患者,大家来说说吧。主要原因是这三个1。口腔你可知苍耳挂在裤子上的乐趣?这对长沙父子的周末野游快出攻略吧易小时今年8岁,是一个普通的长沙孩子。但他的周末和大部分同龄孩子相比很不一样爸爸易柯明每个周末都会带他从长沙家中出发前往周边进行短途旅行。从易小时还是婴儿起,爸爸就已经抱着他开始短跟Clara学英语(一)身体器官英语是个有趣的语言,作为一个90后的宝妈,最近常在家陪宝宝学唱英文歌,勾起学生时代学习英语的乐趣。下面就来复习一下这些可爱的单词吧小宝宝的英语学习,一般从动物生活用品天气家人等与日让孩子少生病的一个食疗方周四孩子早上起床,对我说的第一句话是妈妈,我的感冒全部好透了,前两天早上起床鼻子会有点不通气,今天早上鼻子全部是通气的,感觉很舒服。我洋洋得意,看来我这个老中医医术还可以啊。最近一团史微故事帮教失足青少年!广州共青团联合法院发起金不换工程视频加载中1994年11月底,羊城金不换工程正式启动。这是由团广州市委和广州市中级人民法院牵头发起的社会帮教失足青少年司法项目。目的在于建立帮教体系,为失足青少年提供特殊的帮助和服喜讯!天堂镇朱所村入选第九批全国民主法治示范村(社区)日前,司法部民政部公布了第九批全国民主法治示范村(社区)名单,新兴县天堂镇朱所村榜上有名。朱所村位于天堂镇东北面,距天堂镇中心约5公里,现有16条自然村,该村历史文化底蕴深厚,曾获稻的一生(一)种子父亲的手拂过火塘最旺的那一束火焰捧出的,成为种子三月风,在青石板上清亮种子和日光对完话入夜,又和水中月亮细语最后神圣的沐浴种子,在成为种子以前以一种神秘的仪式向前世告别(国民老公王思聪终于收心!带新女友逛街女方疑似怀孕国民老公王思聪除了有钱任性,还有就是他换女友的速度而且一般美女看不中,都是一些肤白貌美的网红。自从王思聪当上了娱乐圈的纪检委敢说敢做,曾和冯小刚微博互怼想必也没有谁了吧!但是最引人正海磁材发行可转债14亿元11月23日申购中证网讯(记者张鹏飞)正海磁材11月20日晚间发布公告称,公司向不特定对象发行可转换公司债券(以下简称可转债或正海转债)已获得证监会同意注册。公告显示,本次可转债的发行总额为人民币
浙江银保监局推广无还本续贷有效解决过桥融资贵这一全国性难题浙江银保监局推广无还本续贷政策,有效解决了过桥融资贵这一全国性难题,为企业节省过桥成本至少在百亿级别更重要的是避免企业资金链断裂,化解了风险。截止今年9月29日,浙江无还本续贷款余中超积分榜有变!浙江33升第4,河南力阻武汉三镇,山东泰山开心11月13日晚上,中超第25轮多场精彩赛事上演,浙江过招沧州雄狮。第5分钟,马辅渔低射入网得分,进球古城很诡异,先是击中立柱,但是弹进网窝,10!沧州取得梦幻般的开局。第27分钟,因为老年团旅游!浙江一地部分中小学临时停课,家长发愁死了家长们现在一觉醒来都会习惯性地看看手机上的消息,就怕突然收到停课通知。每次一看见这种消息,第一反应都是烦躁,不为别的,就是孩子们在家待一天想想都头大,巴不得每天都希望孩子去学校上学河南汝州工业企业复工复产开启加速度顶端新闻河南商报见习记者焦河洋通讯员宋乐义杜燕燕本轮疫情刚开始的时候对我们企业确实造成了一些影响,但是在市疫情防控指挥部和相关部门的帮助指导下问题很快就得到了解决。你看,现在我们厂济宁牛楼村入选第四批全国乡村旅游重点村近日,文化和旅游部国家发展改革委公布了全国乡村旅游重点村镇名录的第四批全国乡村旅游重点村名单,全省共7个村庄入选,济宁市牛楼村成功入选。目前,济宁共有六个村入选全国乡村旅游重点村名红草黄花秋意晚大地铺就红地毯秋末冬初,草木褪去绿色,逐渐枯黄。大港油田幸福路的碱蓬草观景长廊,碱蓬草却依然执着,红色绽放。在阳光的照射下,红得浓烈的碱蓬草成团成簇,茂盛生长的碱蓬草将海滩湿地铺上了温暖地毯,天定档11月16日!OPPOA1Pro外观公布,不止超窄双曲屏1亿像素虽然双十一热潮已过,但机圈的热度始终高涨,即将在年底发布的众多机型引发了不少用户的关注。11月14日,OPPO官方微博宣布,OPPOA1Pro新品发布会将于11月16日召开,并打出金税四期很恐怖?来看看金税四期五个阶段的建设目标内容金四的目标愿景金四是推进税收现代化的一场系统性改革。目标是通过推动思维和理念业务和制度组织和岗责技术和平台四个方面的转型升级,打造具有高集成功能高安全性能高应用效能的智慧税务。一金北交所发布实施融资融券业务规则北京证券交易所日前发布实施北京证券交易所融资融券交易细则,并配套发布实施北京证券交易所融资融券业务指南,对会员业务开展流程交易业务管理保证金和维持担保比例管理投资者适当性管理等方面2023年养老金上调,养老金低的能多涨吗?养老金3000元能涨多少?点击上方蓝色按钮,即可收听全文。2023年养老金上调,养老金低的能多涨吗?3000元以下的能涨多少?2022年即将结束,退休人员们开始期待2023年养老金上调,因为从2005年以来登山遇险令台胞感受两岸一家亲据台湾中时新闻网11月12日报道,台胞登山遇险却意外感受到了血浓于水的两岸一家亲。据报道,常住苏州的台胞杨良学,在回忆自己在大陆十一长假期间发生的一场意外时,激动不已地说我们素昧平