一.已知一個類的名字及其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開始