<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)  編輯  收藏


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


    網站導航:
     
    主站蜘蛛池模板: 免费国产黄网站在线看| 国产亚洲精品影视在线| 中文字幕乱理片免费完整的| 亚洲国产一区视频| 手机永久免费的AV在线电影网| 99热这里有免费国产精品| 久久精品视频亚洲| 四虎影视大全免费入口| 国产成人亚洲精品| 最近最新的免费中文字幕| 亚洲国产区男人本色在线观看| 污污网站免费观看| 国产成人免费福利网站| 亚洲av无码有乱码在线观看| 国产精品jizz在线观看免费| www免费黄色网| 亚洲AV无码专区在线播放中文| 可以免费观看的毛片| 久久精品a亚洲国产v高清不卡| 久久精品免费观看| 亚洲人成7777| 全部免费a级毛片| 久久久久免费精品国产| avtt天堂网手机版亚洲| 国产精品免费视频播放器| 久久久久久久国产免费看| 免费的一级黄色片| 日本一区二区三区在线视频观看免费| 久久久久久国产精品免费免费| 亚洲av乱码一区二区三区按摩| 免费国产综合视频在线看| 在线观看免费视频一区| 亚洲国产精品日韩在线观看| 天天摸夜夜摸成人免费视频| 在线播放国产不卡免费视频| 亚洲AV日韩AV鸥美在线观看| 四虎成人免费观看在线网址| 免费无码又爽又刺激高潮软件| 亚洲成人在线网站| 日本免费无遮挡吸乳视频电影| 一级特黄a大片免费|