<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    java技術研究

    統計

    留言簿(3)

    閱讀排行榜

    評論排行榜

    通過反射動態使用Java類(轉)

     

    一.已知一個類的名字及其class文件,如何使用此類?

    1.如果此類位于一個已打包的jar文件中,按如下方法調用:
    URL url = new URL("file:/E:/Work/Projects/Output/FrameWork.jar");
    URLClassLoader ul = new URLClassLoader(new URL[]{url});
    Class aClass = ul.loadClass("com.hdpan.exercise.loader.ProduceObject");
    Object obj = aClass.newInstance();

    注意的是URLClassLoader.loadClass()方法的參數要包括package的名字,例如這里面如果寫成ProduceObject就是錯誤的。

    2.如果此類是一個class文件,位于一個文件夾中,按如下方法調用:
    首先要確認的是class的package的名字與目錄名應該一致。
    URL url = new URL("file:/E:/Work/Projects/FrameWork/bin");
    URLClassLoader ul = new URLClassLoader(new URL[]{url});
    Class aClass = ul.loadClass("com.hdpan.exercise.loader.ProduceObject");
    Object obj = aClass.newInstance();
    這里面的URL的路徑指到package名的上一層目錄位置,例如這里如果寫成file:/E:/Work/Projects/FrameWork/bin/com/hdpan/exercise/loader就是錯誤的

    Class這個類中還有許多的get方法可以使用。

    二.如何打印class中的所有方法?
    Method[] md = aClass.getDeclaredMethods();
    for (int i = 0; i < md.length; i++){
    System.out.println(md.getName());
    }
    md.getModifiers();
    md.getReturnType();
    md.getParameterTypes();
    md.getExceptionTypes();

    Method這個類中還有許多的屬性可以get得到。

    如果有兩個方法的Name是一樣的,但是參數不一樣:
    Method md = aClass.getMethod("setField1",new Class[]{Integer.TYPE});
    第一個參數是方法的名字,第二個參數是一個數組,如果是基本數據類型的話,使用其外覆類的類型,例如int使用Integer.Type,float使用Float.Type

    例如,如果類中是這樣的定義的:
    public void setField1(int field1,String info) {
    this.field1 = field1;
    System.out.println(info);
    }

    那么在使用的時候:
    Method md = clas.getMethod("setField1",new Class[]{Integer.TYPE,String.class});

    三.如何調用class中的方法?
    調用方法:

    Object obj = aClass.newInstance();
    Method mds = aClass.getMethod("setField1",new Class[]{Integer.TYPE});
    mds.invoke(obj,new Object[]{new Integer(5)});

    對invoke方法,第一個參數是方法所在的對象,如果方法是static的,那么此處可以是null,如果方法不是static的,但是此處是Null的話將會出現NullPointerException
    第二參數是方法所需要的參數的對象數組,如果是基本數據類型的話,使用其外覆類的類型,例如int使用Integer.Type,float使用Float.Type

    例如,如果類中是這樣的定義的::
    public void setField1(int field1,String info) {
    this.field1 = field1;
    System.out.println(info);
    }
    那么在使用的時候:
    Object obj = aClass.newInstance();
    Method md = aClass.getMethod("setField1",new Class[]{Integer.TYPE,String.class});
    md.invoke(obj,new Object[]{new Integer(5),"This is a Test"});

    如果想取得方法的返回值:
    public int getField1() {
    return field1;
    }

    那么在使用的時候:
    mds = aClass.getMethod("getField1",null);
    Integer integer = (Integer)mds.invoke(obj,null);
    System.out.println(integer.intValue());

    Method方法返回的類型是Object,根據具體的方法返回值類型,將其下溯到具體的類型。

    源程序:
    ProduceObject.java
    =================================
    //ProduceObject.java開始
    package com.hdpan.exercise.loader;

    public class ProduceObject {

    public int getField1() {
    return field1;
    }

    public void setField1(int field1) {
    this.field1 = field1;
    }
    public void setField1(int field1,String info) {
    this.field1 = field1;
    System.out.println(info);
    }

    public static double getField2() {
    return field2;
    }

    public static void setField2(double field2) {
    ProduceObject.field2 = field2;
    }
    private int field1;
    private static double field2;

    public static void main(String[] args) {
    }
    }
    //ProduceObject.java結束
    =========================

    TestLoader.java
    =========================
    //TestLoader.java開始
    package com.hdpan.exercise.loader;

    import java.lang.reflect.Method;
    import java.net.URL;
    import java.net.URLClassLoader;

    public class TestLoader {

    public static void main(String[] args) throws Exception {
    try {
    //URL url = new URL("file:/E:/Work/Projects/Output/FrameWork.jar");
    URL url = new URL("file:/E:/Work/Projects/FrameWork/bin/com/hdpan/exercise/loader");

    URLClassLoader ul = new URLClassLoader(new URL[]{url});

    //Class clas = ul.loadClass("ProduceObject");
    Class aClass = ul.loadClass("com.hdpan.exercise.loader.ProduceObject");

    Object obj = aClass.newInstance();
    Method mds = aClass.getMethod("setField1",new Class[]{Integer.TYPE,String.class});
    mds.invoke(obj,new Object[]{new Integer(5),"haha"});

    mds = aClass.getMethod("getField1",null);
    Integer integer = (Integer)mds.invoke(obj,null);
    System.out.println(integer.intValue());
    //System.out.println(((com.hdpan.exercise.loader.ProduceObject)obj).getField1());

    Method[] md = aClass.getDeclaredMethods();
    for (int i = 0; i < md.length; i++){
    System.out.println(md.getName());
    }

    } catch (Exception e) {
    System.out.println(e);
    }

    }
    }
    //TestLoader.java開始

    posted on 2007-04-26 16:57 小秦 閱讀(467) 評論(0)  編輯  收藏


    只有注冊用戶登錄后才能發表評論。


    網站導航:
     
    主站蜘蛛池模板: 7m凹凸精品分类大全免费| 成人av片无码免费天天看| 免费观看无遮挡www的小视频| 国产精品亚洲а∨无码播放| 好湿好大好紧好爽免费视频| 亚洲色欲久久久久综合网| 特级毛片免费播放| 亚洲AⅤ无码一区二区三区在线| 特级一级毛片免费看| 亚洲精品国产va在线观看蜜芽| 一道本不卡免费视频| 狠狠色婷婷狠狠狠亚洲综合| 国产性生大片免费观看性| 永久亚洲成a人片777777| 中文字字幕在线高清免费电影| 亚洲熟妇中文字幕五十中出| 免费观看男人吊女人视频| 亚洲人成在线影院| 18禁止观看免费私人影院| 亚洲一本到无码av中文字幕| 国产婷婷高清在线观看免费| 三级片免费观看久久| 亚洲乱色熟女一区二区三区丝袜| 四虎影视成人永久免费观看视频 | 大学生美女毛片免费视频| 亚洲AV无码国产一区二区三区| 免费少妇a级毛片人成网| 中文字幕的电影免费网站| 亚洲欧洲日产国产综合网| www.黄色免费网站| 人妻仑乱A级毛片免费看| 亚洲一区二区三区首页| 午夜寂寞在线一级观看免费| 毛片基地看看成人免费| 亚洲另类春色校园小说| 免费人妻av无码专区| 国产羞羞的视频在线观看免费| 亚洲二区在线视频| 亚洲精品国产高清不卡在线| 精品国产sm捆绑最大网免费站 | 77777亚洲午夜久久多喷|