必威体育Betway必威体育官网
当前位置:首页 > IT技术

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

时间:2019-11-04 01:45:41来源:IT技术作者:seo实验室小编阅读:82次「手机版」
 

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群,一起交流学习。

文章最后发布于: 2018-09-29 17:34:15

相关阅读

java实现高效文件下载

https://blog.csdn.net/neweastsun/article/details/80710184

Java中方法重载、方法覆写以及方法重载与方法覆写的区

文章目录1 方法重载2 方法覆写3 方法重载与方法覆写的区别3.1 概念上3.2 范围上3.3 限制1 方法重载 概念: 方法名称相同,参数的个数

javaMail实现邮件发送

平常我们在做登陆注册的时候需要需要对邮箱进行验证,向邮箱发送验证信息。下面是我在做注册的时候向邮箱发送验证码代码。邮箱校验

Java编程---数组

1.定义数组是一种数据结构,用来存储同一类型值的集合。通过一个整型下标可以访问数组中的每一个值。例如:如果a是一个整型数组,a[i]

Java——事件处理机制监听者基础(一)动作监听ActionList

介绍:ActionListener是一个接口,ActionEvent通常在点击一个按钮或双击某个列表项或选中某个菜单时发生。如何设置监听:对监听者添加A

分享到:

栏目导航

推荐阅读

热门阅读