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

          

          公用通道>

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

          IT技能讨论

          Java反射

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

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

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

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

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

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

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

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

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

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

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

          Class类w授权:代表一个类唯一官方b。

          File类娱乐:代表类的成员变量站网址授权授权(成员变量也成为类的属性唯一)

          Method类bn:代表类的办法网站。

          Construtor类官方娱乐:代表类的结构办法

          Arry类官方网唯一:提供了静态创立数组,以及拜访数组的元素的静态办法w网平台。

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

          newInstance()

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

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

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

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

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

          想获取一个办法经过这个办法的名字和办法的参数w(由于有重载以是才要参数)

          invoke(Object obj, Object... args)

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

          代码实例

          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()取得工具的一切属性授权唯一,每个属性对应一个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();这个是独一的授权网网,

          // 运用默许的结构办法i,而这里运用的则是全能的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一样承继自Object唯一,实在体用以表达Java顺序运转时的classes和interfacesw站网址,也用来表达enumbi站平台、array授权、primitiveb平台官网、Java types

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

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

          上一篇平台站唯一唯一:进步MySQL 盘问服从的本领 下一篇i:成为Java妙手的25个学习目的
          

          bwin平台网址征询教师

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

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