利用java反射机制,获取加载类的方法,并执行加载类的方法。代码如下:
package com.eric.ykk.study;
import java.lang.reflect.Array;
import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
public class MethodTest {
private int a=0;
private int b=0;
public MethodTest(){
}
public MethodTest(int a,int b){
this.a = a;
this.b = b;
System.out.println("a="+a+",b="+b);
}
public int add(int a,int b){
return a+b;
}
public static void main(String[]args){
try {
/**
* 利用反射操作加载类的方法
*/
Class methodClass = Class.forName("com.eric.ykk.study.MethodTest");
//定义参数列表
Class paraTypes[] = new Class[2];
paraTypes[0] = Integer.TYPE;
paraTypes[1] = Integer.TYPE;
//获取加载类中方法名为add,参数列表为paraTypes的方法
Method method = methodClass.getMethod("add", paraTypes);
MethodTest methodTest = new MethodTest();
Object[] argList = new Object[2];
argList[0] = new Integer(20);
argList[1] = new Integer(30);
/**
* public Object invoke(Object obj,Object args[])
* 参数:
* obj:从中调用底层方法的对象,必须是实例化的对象
* args:用于方法调用的参数,是个Object数组,因为参数有可能有多个
* 返回:
* 使用参数 args在 obj上指派该对象所表示方法的结果
*/
Object result = method.invoke(methodTest, argList);
Integer resultInt = (Integer)result;
System.out.println(resultInt.intValue());
/**
* 利用反射操作加载类的构造函数
*/
//获取加载类指定参数列表的构造函数
Constructor ct = methodClass.getConstructor(paraTypes);
//根据传入的参数,执行构造函数,创建加载类的对象
Object conResult = ct.newInstance(argList);
MethodTest testConstrutor = (MethodTest)conResult;
System.out.println(testConstrutor.getA());
System.out.println(testConstrutor.getB());
/**
* 反射操作数组
*/
int [] arrayTest ={11,12,13,14,15,16};
//获取数组元素的类型
Class<?> elementType = arrayTest.getClass().getComponentType();
System.out.println(elementType.toString());
int length = Array.getLength(arrayTest);
//创建元素类型,创建指定长度的对象
Object arrayNew = Array.newInstance(elementType, length*2);
for(int i=0;i<length;i++){
Object valueArray = Array.get(arrayTest, i);
//设置数据指定位置的值
Array.set(arrayNew, i, valueArray);
}
int [] arrayLast = (int[])arrayNew;
System.out.println(arrayLast[0]);
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SecurityException e) {
e.printStackTrace();
} catch (NoSuchMethodException e) {
e.printStackTrace();
} catch (IllegalArgumentException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
} catch (InstantiationException e) {
e.printStackTrace();
}
}
public int getA() {
return a;
}
public void setA(int a) {
this.a = a;
}
public int getB() {
return b;
}
public void setB(int b) {
this.b = b;
}
}
运行结果如下:
50
a=20,b=30
20
30
int
11