java反射操作类的方法

利用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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值