`

java 反射调用类的方法

 
阅读更多

最近遇到一个问题,重复的写一些方法,这些方法基本除了调用对象的方法不同外其他的都相同,发现这个相同点后,就在考虑怎么写一个方法,只需要传入对象方法的名字就可以对方法进行调用。

这里会用到java反射:

首先建立一个使用反射调用的类Computer:

package com;

public class Computer {
	
	
	public Computer(){
		super();
	}
	
	public void surfInternet(){
		System.out.println("网上冲浪");
	}
	
	public void watchTV(){
		System.out.println("网上看电视");
	}
	
	public void workOffice(){
		System.out.println("网上办公");
	}
	
	public int getLength(String str){
		System.out.print("字符长度为: ");
		return str.length();
	}
	
	public static String getName(String name){
		return name;
	}
	
}

 下面我写一个反射调用的主函数:

package com;

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

public class TestReflect1 {
	
	public static Object invokeMethod(Method method,Object obj,Object...args) throws IllegalArgumentException, IllegalAccessException, InvocationTargetException{
		return method.invoke(obj, args);
	}
	
	public static void main(String[] args) {
		try {
			
			
			int len = (Integer)invokeMethod(Computer.class.getMethod("getLength", String.class),Computer.class.newInstance(),"HP");
			System.out.println(len);
			
			String str = (String)invokeMethod(Computer.class.getMethod("getName", String.class),null,"HP");
			System.out.println(str);
			
			String [] strs = new String[]{
				"watchTV","surfInternet","workOffice"
			};
			for(int i=0;i<strs.length;i++)
				invokeMethod(Computer.class.getMethod(strs[i], null), Computer.class.newInstance(), null);
		} catch (IllegalArgumentException e) {
			e.printStackTrace();
		} catch (SecurityException e) {
			e.printStackTrace();
		} catch (IllegalAccessException e) {
			e.printStackTrace();
		} catch (InvocationTargetException e) {
			e.printStackTrace();
		} catch (NoSuchMethodException e) {
			e.printStackTrace();
		} catch (InstantiationException e) {
			e.printStackTrace();
		}
	}
}

 比较下面的代码:

int len = (Integer)invokeMethod(Computer.class.getMethod("getLength", String.class),Computer.class.newInstance(),"HP");
			System.out.println(len);
			
			String str = (String)invokeMethod(Computer.class.getMethod("getName", String.class),null,"HP");
			System.out.println(str);

 发现一个传入了对象一个没有传入对象,原因是在于一个为成员方法,一个为静态方法,静态方法可以说是在类加载的时候就已经创建了,而成员方法必须是对象创建是才被创建,所以成员方法必须加入对象。

再看下面的调用:

			String [] strs = new String[]{
				"watchTV","surfInternet","workOffice"
			};
			for(int i=0;i<strs.length;i++)
				invokeMethod(Computer.class.getMethod(strs[i], null), Computer.class.newInstance(), null);
		

 Computer中含有3个类似的方法,而且参数基本相同,所以我就使用一个数组的方式来对这个对象进行调用,而不是直接通过对象调用方法。

 

这样做就可以在进行相似处理时传入对象的方法来进行调用。

 

但是使用反射后运行效率会下降,但是代码的重用性却提高了不少。

分享到:
评论

相关推荐

    java 反射 调用私有方法(有参数私有方法)获取私有属性值

    Java反射是Java语言提供的一种强大的动态类型特性,它允许程序在运行时检查类、接口、字段和方法的信息,并且能够动态地创建对象和调用方法。这个能力使得开发者可以突破静态类型的束缚,实现一些在编译时期无法完成...

    Java方法反射调用demo

    Java反射是Java编程语言中的一个强大特性,它允许在运行时检查类、接口、字段和方法的信息,并且能够在运行时动态地创建对象和调用方法。这个特性使得Java具有了高度的灵活性,常用于框架开发、插件系统、元编程等...

    Java反射调用方法

    在给定的代码中,`TestRef` 类展示了如何使用Java反射调用方法。首先,我们创建了一个 `Foo` 类,它有一个私有字符串成员变量 `msg` 和三个方法:`setMsg`、`getMsg` 和 `outInfo`。`main` 方法是演示反射调用的入口...

    Java反射调用工具类

    Java反射调用是Java语言提供的一种强大的动态类型机制,它允许程序在运行时检查并使用类的信息,包括类的方法、属性以及构造器等。在Java中,反射是通过`java.lang.reflect`包中的类实现的,如`Class`、`Constructor...

    通过反射调用静态方法

    在Java编程中,反射是一种强大的工具,它允许我们在运行时检查和操作类、接口、字段以及方法等...这些文件都是Java开发中的常见元素,与反射调用静态方法的主题直接关联性不大,但它们构成了一个完整的Java项目环境。

    JAVA反射机制的入门代码

    4. **调用方法**:使用`Class`对象的`getMethods()`或`getDeclaredMethods()`获取公共或私有方法,然后通过`Method`对象的`invoke()`方法执行这些方法。对于静态方法,可以不传入对象;对于非静态方法,需要传入对应...

    frida反射调用对象中的方法与字段.pdf

    Java反射是指在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性。这种动态获取信息以及动态调用对象方法的功能称为Java的反射机制。反射机制为...

    java 反射得到某个方法

    例如,当我们需要对未知类型的对象进行通用操作,或者需要在运行时动态调用方法时,反射就显得非常有用。 然而,尽管反射提供了很大的灵活性,但也要注意其潜在的风险。过度使用反射可能导致代码难以理解和维护,...

    反射,动态加载指定类调用类中的方法

    反射机制使得我们能够在运行时动态地获取类的信息,并且能够创建对象、调用方法、访问字段,甚至改变类的行为。在Java中,`java.lang.reflect`包提供了对反射的支持。 在“反射,动态加载指定类调用类中的方法”这...

    Java 反射创建get set方法及反射方法的调用

    在Java编程语言中,反射(Reflection)是一种强大的技术,它允许程序在运行时检查类、接口、字段和方法的信息,并能够动态地创建对象和调用方法。本文将详细介绍如何利用Java反射来创建get和set方法,并演示如何通过...

    java反射调用实例代码

    Java反射是Java编程语言中的一个强大特性,它允许在运行时检查类、接口、字段和方法的信息,并且能够在运行时动态地创建对象和调用方法。这个资源“java反射调用实例代码”提供了关于如何使用Java反射API进行各种...

    java反射调用

    java反射调用set方法时如果让参数做自动类型转换5 这段时间学习java的反射机制想实现一个功能:遍历一个Map,然后利用反射机制调用BO的set方法,完成BO属性的自动注入。这样设计的初衷是解决Excel数据导入问题中的...

    groovy和Java相互调用1

    2. **方法2:反射动态调用** - 使用Java的反射机制,可以在运行时动态加载和执行Groovy类。这种方法的优点是Groovy脚本的修改不需要重新编译整个项目,因为Java代码可以通过反射动态地找到并调用Groovy方法。这里,...

    通过java类的路径实例化类并调用方法

    通过java类的路径实例化类并调用方法:仅仅知道类的路径,就可以实例化对象,利用反射机制调用其方法

    Java反射方法调用

    Java反射机制是Java语言提供的一种强大的工具,它允许我们在运行时检查类、接口、字段和方法的信息,并且能够在运行时动态地创建对象和调用方法。这个特性在处理不确定类型的对象或者实现动态代理等场景中非常有用。...

    Java 反射调用设置值

    Java 反射调用设置值

    java 通过反射获取枚举类,及枚举类的值,枚举类枚举实例名

    在Java编程语言中,反射(Reflection)是一种强大的工具,它允许程序在运行时检查和操作类、接口、字段和方法等对象。枚举(Enumeration)是Java中的一个特殊类类型,用于定义一组常量。本项目"test-enum-demo-...

    java * 反射工具类. 提供调用getter/setter方法, 访问私有变量, 调用私有方法, 获取泛型类型Class

    提供调用getter/setter方法, 访问私有变量, 调用私有方法, 获取泛型类型Class,java * 反射工具类. 提供调用getter/setter方法, 访问私有变量, 调用私有方法, 获取泛型类型Class,java * 反射工具类. 提供调用getter/...

    java动态调用方法

    Java动态调用方法是Java反射机制的一个重要应用,它允许我们在程序运行时,根据需要动态地获取类的信息并调用其方法。这种能力为代码的灵活性和可扩展性提供了强大的支持,尤其在处理不确定的对象类型或者需要在运行...

    java反射调用封装接口

    万能的反射封装接口,值得下载参考,当成util

Global site tag (gtag.js) - Google Analytics