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

          

          公用通道>

          您以后地点地位网址w网址授权唯一: bwin官方娱乐网站 > 行业旧事 > IT技能讨论 >

          IT技能讨论

          Java反射

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

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

          Java反射机制次要提供一下功用站w娱乐站。

          在运转时判别恣意一个工具所属的类平台n。

          在运转时结构恣意一个类的工具站iw。

          在运转时判别恣意一个类所具有的成员变量和办法wb。

          在运转时挪用恣意一个工具的办法官方官网。

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

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

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

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

          Class类娱乐:代表一个类n平台网址wi。

          File类i网站i:代表类的成员变量w娱乐官网网址(成员变量也成为类的属性站平台平台)

          Method类官网唯一站:代表类的办法唯一i站。

          Construtor类授权:代表类的结构办法

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

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

          newInstance()

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

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

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

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

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

          想获取一个办法经过这个办法的名字和办法的参数唯一in官网唯一(由于有重载以是才要参数b站)

          invoke(Object obj, Object... args)

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

          代码实例

          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)

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

          getDeclaredFields()取得工具的一切属性唯一站站官方,每个属性对应一个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();这个是独一的bi平台w,

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

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

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

          // 取得工具的一切属性

          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非常特别i网b官方站,他和普通的classes一样承继自Objectin网址网址,实在体用以表达Java顺序运转时的classes和interfacesb网址站,也用来表达enum娱乐平台、array站授权网址ww、primitive网w、Java types

          bbw官方(booleanw官网b站,byte平台网址唯一网址,char授权,short授权i网址平台,intb娱乐n娱乐i,long网址唯一,floatwi,doublein)以及要害词voidi平台平台。当一个class被加载nnw,或当加载器唯一网平台i(class loader官方)的defineClass官网官方娱乐唯一n(娱乐i平台网址娱乐)被JVM挪用唯一b官网,JVM便自定发生一个Class object网官方唯一。假如你想借由“修正Java规范库源码”来察看Class object的实践天生机遇n(比方在Class的constructor内添加一个println站娱乐(b授权娱乐n)b唯一i网址b,不克不及够官方授权网址站唯一!由于Class并没有public constructor娱乐)

          Class是Reflection来源n网址b平台。针对任何你想探勘的classb站b,唯有先为他发生一个cClass objectnbibb,接上去才干经过后者唤起为数十多个的Reflection APISb。
          请求收费试学】【在线报名在线征询

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

          bwin平台网址征询教师

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

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