Java反射——如何通过Java中的反射调用对象的方法?

 

一.Java反射拿到调用对象的方法

1.通过Class.forName(“包名+方法的类名”)拿到方法的对象;

如:Class<?> clazz = Class.forName("ReflectionTest");

        也可以通过实例,获取方法的对象类,

        如:String str = "test , reflection";

        Class<?> clazz = str.getClass();

2.明确反射方法名称 ;

3.明确方法的参数类型,就可以拿到对象的方法。

如:Method method = clazz.getMethod("test",String.class,int.class);

 

 

 二.接着就是invoke()调用方法了:

1.实例化对象,可以直接调用已创建的对象,也可以newInstance()一个。

2.确定具体方法的参数

如:     Object obj1 = method.invoke(clazz.newInstance(),"xiaojun",23);

       System.out.println("直接反射:"+obj1);

 

 

三.补充一些关于Java反射的知识:

Java反射的作用:在Java代码编译时,可以通过反射访问装载到JVM中类的内部信息。

如: Clazz.getName()获取类的完整名字

                  getPackage()获取此类所属的包

                  getSuperclass() 获取父类对应的Class对象

                   getFiled(String name) 获得类的指定成员变量

                   getMethods() 获得类的public类型的方法

                   getMethod(String name, Class[] args) 获取类的指定方法

 

四.具体实例:

import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;

public class ReflectionTest {
	
	public String test(String name ,int age) {
		
		return name+",今年"+age+"岁,是一个极富好奇心地乐观青年!";
	}
	
	public static void main(String args[]) {
		
			String str = "test , reflection";
			int len1 = str.length();
			System.out.println("直接调用length() :"+len1);
			
			//反射String.length()方法
			//直接填入调用该方法的对象str,这里不需要newInstance()
			Object len2 = Reflection(str,str.getClass(),"length",null,null);
			System.out.println("java 反射调用length() :"+len2);
	
			Class<?> clazz;
		
				try {
					
					//调用自己创建的函数,
					//反射得到类 包名+类名,我这边没有包名就直接是 "ReflectionTest"
					clazz = Class.forName("ReflectionTest");
					
					//直接java反射得到方法
					Method method= clazz.getMethod("test",String.class,int.class);
					Object obj1 = method.invoke(clazz.newInstance(),"xiaojun",23);
					System.out.println("直接反射:"+obj1);
					
					
					//创建函数完成反射
				  //创建参数class 类型的数组
					Class<?> cla[] = {String.class,int.class};
					Object obj = Reflection(clazz.newInstance(),clazz,"test",cla,"小君",22);
					System.out.println("创建函数完成反射: "+obj);
					
				
				} catch (ClassNotFoundException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				} catch (InstantiationException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				} catch (IllegalAccessException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				} catch (NoSuchMethodException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				} catch (SecurityException 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();
				}

	}
	
	/*
	 * 通过反射执行cclass的方法
	 * @param   object  ---调到该方法的具体对象
	 * @param   cclass  ---具体对象的class类型
	 * @param   paramClasses ---反射方法中参数class类型
	 * @param   methodName   ---反射方法的名称
	 * @param   args    ----调用该方法用到的具体参数
	 * 
	 * 
	 * */
	public static Object Reflection(Object object ,Class<?> cclass,String methodName,Class<?>[] paramclasses, Object... args) {
		
		try {
			
			Method method = cclass.getMethod(methodName,paramclasses);
			return method.invoke(object,args);
			
			
		} catch (NoSuchMethodException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (SecurityException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IllegalAccessException 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();
		}
		
		return null;
		
	}

}

    /* 运行结果:
        直接调用length() :17
        java 反射调用length() :17
        直接反射:xiaojun,今年23岁,是一个极富好奇心地乐观青年!
        创建函数完成反射: 小君,今年22岁,是一个极富好奇心地乐观青年!*/


运行结果:

直接调用length() :17
java 反射调用length() :17
直接反射:xiaojun,今年23岁,是一个极富好奇心地乐观青年!
创建函数完成反射: 小君,今年22岁,是一个极富好奇心地乐观青年!

 

欢迎加入我的Java与Android逆向开发交流QQ群,一起交流学习。

 

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值