代码中包含两个类:
Student.java提供方法
TestClassMethod.java远程调用Student中的方法的例子
---------------------------------------------------------------------------------
package com.java.demo.klass;
import java.util.List;
public class Student {
String name;
public Student(){
this.name = "This is the name of Student!";
}
public Student(String name){
this.name = name;
}
public void showName(){
System.out.println(name);
}
public void print(String value){
System.out.println(value);
}
protected void protectedPrint(String value){
System.out.println(value);
}
public static void main(String[] args){
System.out.println("in main method.");
for (int i = 0; i < args.length; i++) {
System.out.println(args[i]);
}
}
public void multiParames(String[] p1, List p2){
System.out.println("in multiParames method.");
for (int i = 0; i < p1.length; i++) {
System.out.println(p1[i]);
}
for (int i = 0; i < p2.size(); i++) {
System.out.println(p2.get(i));
}
}
}
----类分割线,上面是Student---下面是反射机制调用这个Student中内部方法-------------------------------------------------------------------------------------------------
package com.java.demo.klass;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.List;
public class TestClassMethod {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
try {
Class yourClass = Class.forName("com.java.demo.klass.Student");// 假设你要动态加载的类为YourClass
// 方法1:调用不带参数的构造函数,获得实例。
Student student = (Student) yourClass.newInstance();
student.showName();
// 方法2:调用含有参数的构造函数<重要>
// http://hi.baidu.com/daviddai/blog/item/20f2e31f620f5360f624e4da.html
//定义形式参数
Class[] parameterTypes = new Class[1];// 这里你要调用的方法只有一个参数
parameterTypes[0] = String[].class;//参数类型是string数组
Method method1 = yourClass.getDeclaredMethod("main", parameterTypes); // 参数类型为String
//定义实际参数
Object[] argsP = new Object[1];
String[] argments = new String[2];//假设你要传入两个参数
argments[0] = "OK";
argments[1] = "NO";
argsP[0] = argments;
//调用方法。
method1.invoke(yourClass.newInstance(), argsP);
//方法3:调用内部public方法。
Method method2 = yourClass.getDeclaredMethod("print", String.class); // 参数类型为String
method2.invoke(yourClass.newInstance(), "test");
//方法4:调用内部protected方法。
Method method3 = yourClass.getDeclaredMethod("protectedPrint", String.class); // 参数类型为String
method3.invoke(yourClass.newInstance(), "protectedPrint");
//方法5:调用内部多个参数方法
Class[] parames = new Class[2];
parames[0] = String[].class;
parames[1] = List.class;
//根据参数类型和数量取得,method对象,由于远程类中可用有方法名是一样的方法(重载),这样加上了参数类型就能够定位到具体的某个方法。
Method method4 = yourClass.getMethod("multiParames", parames);
//定义实际参数
Object[] pObjects = new Object[2];
String[] p1 = {"p1_1","p1_2"};
pObjects[0] = p1;
List p2 = new ArrayList();
p2.add("p2_1");
p2.add("p2_2");
pObjects[1] = p2;
//放射机制调用方法。
method4.invoke(yourClass.newInstance(), pObjects);
} catch (InstantiationException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalAccessException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (SecurityException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (NoSuchMethodException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalArgumentException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (InvocationTargetException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}