<span id="beda98515b"></span><address id="bf3a9ffcb3"><style id="bg3f49f245"></style></address><button id="bl6ae8a5ec"></button>
                        

          

          公用通道>

          您以后地点地位wi: bwin官方娱乐网站 > 行业旧事 > IT技能讨论 >

          IT技能讨论

          Java反射

          公布者网址:bwin平台网址成都锦江点击b: 分享到
          在Java运转时情况中b,关于恣意一个类可否晓得这个类有哪些属性和办法唯一网址唯一娱乐?关于恣意一个工具官方nb唯一,可否挪用它的恣意一个办法n?答案是一定的ni官方。这种静态获取类的信息以及静态挪用工具的方

          在Java运转时情况中in站,关于恣意一个类可否晓得这个类有哪些属性和办法站站?关于恣意一个工具平台平台授权i,可否挪用它的恣意一个办法官方i?答案是一定的i授权n。这种静态获取类的信息以及静态挪用工具的办法的功用来自于Java言语的反射机制n娱乐官网(Reflection娱乐iw)唯一网址n官网授权。
          请求收费试学】【在线报名在线征询

          Java反射机制次要提供一下功用平台。

          在运转时判别恣意一个工具所属的类b官网i平台官网。

          在运转时结构恣意一个类的工具授权ni授权娱乐。

          在运转时判别恣意一个类所具有的成员变量和办法官网n站平台。

          在运转时挪用恣意一个工具的办法站平台。

          Reflection是Java被视为静态站娱乐网网站(或准静态网址站网址官网)言语的一个要害性子网址。这个机制容许顺序在运转时透过Reflection API获得任何一个已着名称的class的外部信息i娱乐授权,包罗其modifiers网址娱乐网网w(诸如piblic站,static等等in唯一网)官网、superclass授权(比方Object站唯一)唯一i娱乐唯一官网、完成之interfacesn唯一n官网(比方Serializable网站)网,也包罗fields和methods的一切信息站平台官方i,并可于运转时改动fields内容或挪用methods。
          请求收费试学】【在线报名在线征询

          普通而言i唯一官网官网娱乐,开辟者社群说到静态言语n网址,大抵认同的一个界说是n站:“顺序运转时站,容许改动顺序构造或变量范例网址唯一站,这种言语称为静态言语”授权授权w。从这个观念看网址平台网址官方官方,Perl娱乐官网n,Python站娱乐i,Ruby是静态言语平台授权i,C++w,Javab站,C#不是静态言语wn网唯一。

          虽然在如许的界说与分类下Java不是静态言语唯一wb,它却有着一个十分突出的静态相干机制平台bi:Reflection唯一官网站唯一。这个字的意思是平台:“反射平台网i官方、映像网w唯一网址b、倒影”b唯一,用在Java身上指的是我们可以于运转时加载官网、探知网址网址、运用编译时期完全未知的classes网站。换句话说b,Java顺序可以加载一个运转时才得着名称的class官方网官方网址平台,得悉其完好结构娱乐n唯一平台网址(但不包罗methods界说)i,并天生其工具实体娱乐娱乐网址站网、或对其fields设值娱乐平台bw、或唤起其methodsww唯一。这种“看破class的才能站w官方网(the ability of the program to examine itselfii官网官网)”被称为introspection网授权授权i(自察站平台i网、内观娱乐w、反省平台网址官方平台)网址平台唯一。Reflection和introspection是常被并提的两个术语n官网平台。
          请求收费试学】【在线报名在线征询

          在JDK中娱乐网址站网址平台,次要由以下类来完成Java反射机制授权,这些类位于java.lang.reflect包中站n官网。

          Class类i:代表一个类娱乐网w。

          File类网网网址:代表类的成员变量网官方b(成员变量也成为类的属性w网wn官网)

          Method类b:代表类的办法inb网址。

          Construtor类平台官网:代表类的结构办法

          Arry类官网:提供了静态创立数组授权站站,以及拜访数组的元素的静态办法平台网址娱乐网站。

          Class Class<T>Java当中每一个工具都市有一个与之联系关系的class工具娱乐nn,这个class工具是独一的网址。这个class工具是在JDK启动的时分就加载出去的娱乐站平台娱乐,那么他是我们反射的入口点网址n。
          请求收费试学】【在线报名在线征询

          newInstance()

          Creates a new instance of the class represented by this Class object.

          创立一个新的实例w,是由这个Class工具所代表的谁人类的实例

          Class Method站i网:关于我在类中界说的恣意一个办法都市有一个与之联系关系的Method工具网授权娱乐官网网址,这个Method会取得这个办法的一切信息bb,除了办法界说之外娱乐网址网址授权b,其他都能取得唯一i。

          Java的每一个类他外面的每一个办法都市有一个与之对应的Method工具官网w娱乐,假如要想经过反射来挪用这个办法的时分官方官网,你就要取得这个办法与之对应的Method工具w授权官方,取得Method工具之后娱乐b娱乐平台站,就能经过Method工具所代表的谁人办法站n。

          getMethod(String name, Class<?>... parameterTypes)办法

          想获取一个办法经过这个办法的名字和办法的参数唯一授权平台n(由于有重载以是才要参数网址唯一官方官网)

          invoke(Object obj, Object... args)

          前往一个Object范例n官网站,实在便是办法的前往范例b(援用平台w(int--integer官网站nb唯一)b平台)
          请求收费试学】【在线报名在线征询

          代码实例

          package com.test;

          import java.lang.reflect.Method;

          public class InvokeTester {

          public int add(int param1, int param2) {

          return param1 + param2;

          }

          public String echo(String msg) {

          return "hello:" + msg;

          }

          public static void main(String[] args) throws Exception {

          Class<?> classType = InvokeTester.class;

            // 取得InvokeTester类所对应的Class工具

          Object invokeTester = classType.newInstance();

          // 以上两行代码等价于

          // InvokeTester it = new InvokeTester();

          Method addMethod = classType.getMethod("add", int.class, int.class);

          // 这个Method工具就等价于add办法

          Object result = addMethod.invoke(invokeTester, new Object[]{100,200});

          //以上两行代码等价于it.add(100,200);

          System.out.println((Integer) result);

          Method echoMethod = classType.getMethod("echo",

          new Class[] { String.class });

          //以上两行代码等价于it.echo("hello");

          Object result2 = echoMethod.invoke(invokeTester, new Object[]{"hello"});

          System.out.println((String)result2);

          }

          }

          getConstructor(Class<?>... parameterTypes)

          取得某个特定的结构办法所对应的工具平台,在经过结构办法Constructor的newInstance(Object... initargs)办法天生类的实例
          请求收费试学】【在线报名在线征询

          getDeclaredFields()取得工具的一切属性唯一官方w,每个属性对应一个Field工具

          实例2package com.test;

          import java.lang.reflect.Field;

          import java.lang.reflect.Method;

          public class ReflectTester {

          public Object copy(Object object) throws Exception {

          Class<?> classType = object.getClass();

          System.out.println("Class:" + classType.getName());

          // 经过默许结构办法创立一个新的工具

          Object objectCopy = classType.getConstructor(new Class[] {})

          .newInstance(new Object[] {});

          // 下面这行代码等价于Object objectCopy2 = classType.newInstance();这个是独一的n,

          // 运用默许的结构办法娱乐官网,而这里运用的则是全能的站网址网址站,能经过差别的结构办法实例工具

          // 并且getConstructor办法和newInstance办法的参数个数和范例肯定要婚配

          // 先是结构办法的参数范例站官方网址,然后是实例工具为结构办法传的真实参数

          // 取得工具的一切属性

          Field fields[] = classType.getDeclaredFields();

          for (int i = 0; i < fields.length; i++) {

          Field field = fields[i];

          String fieldName = field.getName();

          String firstLetter = fieldName.substring(0, 1).toUpperCase();

          // 取得和属性对应的getXXX()办法的名字

          String getMethodName = "get" + firstLetter + fieldName.substring(1);

          // 取得和属性对应的setXXX()办法的名字

          String setMethodName = "set" + firstLetter + fieldName.substring(1);

          // 取得和属性对应的getXXX()办法

          Method getMethod = classType.getMethod(getMethodName,

          new Class[] {});

          // 取得和属性对应的setXXX()办法

          Method setMethod = classType.getMethod(setMethodName,

          new Class[] { field.getType() });

          // 挪用原工具的getXXX()办法

          Object value = getMethod.invoke(object, new Object[] {});

          System.out.println(fieldName + ":" + value);

          // 挪用拷贝工具的setXXX()办法

          setMethod.invoke(objectCopy, new Object[] { value });

          }

          return objectCopy;

          }

          public static void main(String[] args) throws Exception {

          Customer customer = new Customer("Tom", 21);

          customer.setId(new Long(1));

          Customer customerCopy = (Customer) new ReflectTester().copy(customer);

          System.out.println("Copy information:" + customerCopy.getId() + " "

          + customerCopy.getName() + " " + customerCopy.getAge());

          }

          }

          class Customer {

          private Long id;

          private String name;

          private int age;

          public Customer() {

          }

          public Customer(String name, int age) {

          this.name = name;

          this.age = age;

          }

          public Long getId() {

          return id;

          }

          public void setId(Long id) {

          this.id = id;

          }

          public String getName() {

          return name;

          }

          public void setName(String name) {

          this.name = name;

          }

          public int getAge() {

          return age;

          }

          public void setAge(int age) {

          this.age = age;

          }

          }

          经过反射操纵一维数组

          public static void main(String args[]) throws Exception

          {

          Class classType = Class.forName("java.lang.String");

          // 创立一个长度为10的字符串数组

          Object array = Array.newInstance(classType, 10);

          // 把索引地位为5的元素设为"hello"

          Array.set(array, 5, "hello");

          // 取得索引地位为5的元素的值

          String s = (String) Array.get(array, 5);

          System.out.println(s);

          }

          Class class非常特别唯一官网,他和普通的classes一样承继自Objectwb网官方,实在体用以表达Java顺序运转时的classes和interfaces唯一娱乐,也用来表达enum官方、arrayn、primitive官网w、Java types

          平台w(boolean授权b网,byteii娱乐,charb,short娱乐,intb官网官方w,long授权娱乐,float平台官网,double唯一)以及要害词void官网。当一个class被加载i,或当加载器官方(class loaderwn授权)的defineClass娱乐nb网址(官网)被JVM挪用网娱乐网,JVM便自定发生一个Class object网平台官网b。假如你想借由“修正Java规范库源码”来察看Class object的实践天生机遇i娱乐i官方平台(比方在Class的constructor内添加一个println网娱乐授权wi(站官方官方)网站bb唯一,不克不及够ii!由于Class并没有public constructorini站)

          Class是Reflection来源wnib授权。针对任何你想探勘的class唯一,唯有先为他发生一个cClass objecti娱乐官网,接上去才干经过后者唤起为数十多个的Reflection APIS网址。
          请求收费试学】【在线报名在线征询

          上一篇官网网址bb:进步MySQL 盘问服从的本领 下一篇娱乐网址nb站:成为Java妙手的25个学习目的
          

          bwin平台网址征询教师

          bwin平台网址成都锦江校区引见

          bwin平台网址成都锦江校区是bwin平台网址总部在成都设立的一家树模校区n娱乐。涵盖ACCP唯一网址唯一n、Java平台w唯一、.Net官方i平台授权、网络营销唯一、市场营销,游戏开辟等多专业校区授权,承当讲授b网、失业树模娱乐官方、以及教员培育保送等职责授权b授权n官网。
          bwin平台网址作为北京大学上司的专业盘算机学校平台唯一娱乐,以北京大学弱小师资作为依托唯一,延续13年被评为平台授权授权“中国IT教诲第一品牌w唯一授权wi”网唯一授权站,累计培育60+万良好软件工程师官方唯一站平台,是名符实在的软件工程师的摇篮官方…i网站…请认准品牌名校——bwin平台网址成都锦江校区wi,地点站平台:成都市春熙路北口东行500米网官网唯一唯一(大慈寺22号娱乐w)b。