【java】反射,关于Method类

本想等把反射技术看完再写篇文章总结下,但是刚看到Method类的时候,出了一点小差错,花了一点时间,解决了问题。虽然事后总结发现很简单的小问题,但是还是决定记录一下吧,毕竟好久没写博客了。

 

是这样的,我想通过反射技术获取String类的成员方法(以toLowerCase和charAt为例)。

步骤应该是这样的,首先获取String类的字节码对象,然后调用该对象的getMethod方法,返回Method对象,

再通过Method对象的invoke方法,调用Method所调用的底层的方法。具体实现如下:

private static void reflectMethod_2()throws Exception
	{
		String str1=new String("basketball");
		Method method=String.class.getMethod("charAt",int.class);//获取charAt方法
		System.out.println(method.invoke(str1, 1));//调用charAt方法,打印结果:a
	}

很容易就实现了。接下来我想获取toLowerCase方法,采用同样步骤,这里注意一个问题,toLowerCase方法的参数是空(null),没有对应的字节码对象,所以调用

MethodgetMethod(String name,Class<?>... parameterTypes)
方法时,参数必须强制转成Class类型。

代码如下:

//使用反射技术获取String类中toLowerCase方法
	private static void reflectMethod()throws Exception
	{
		String str1=new String("ABCDEFG");
		Method method=String.class.getMethod("toLowerCase",(Class<?>)null);
							//获取toLowerCase() 方法
		System.out.println(method.invoke(str1, (Object)null));
							//invoke方法执行Method对象所调用的底层的方法,该方法的原型是
		/*		public Object invoke(Object obj,Object... args)
		 throws IllegalAccessException,
		        IllegalArgumentException,
		        InvocationTargetException*/
	}


没想到运行时居然出错了。。。。。。。。。。。大哭

错误提示如下:

java.lang.NoSuchMethodException: java.lang.String.toLowerCase(null)
 at java.lang.Class.getMethod(Class.java:1622)
 at reflectDemo.ReflectMethod.reflectMethod(ReflectMethod.java:35)
 at reflectDemo.ReflectMethod.main(ReflectMethod.java:23)
居然抛出“没有该方法异常”。。。。

开始我还以为是函数名写错了,仔细看了一遍toLowerCase没错呀。。。

 

最后终于发现了问题,原来是强制转型出错了,这里不应该转成Class<?>,因为该方法的第二个参数是可变参数(...)的,内部封装的是数组,所以这里应该强制转成字节码类数组型Class<?>[],

同理,调用invoke方法,也应该将null转成Object[]型。代码如下:

private static void reflectMethod()throws Exception
	{
		String str1=new String("ABCDEFG");
		Method method=String.class.getMethod("toLowerCase",(Class<?>[])null);
							//获取toLowerCase() 方法,这里因为该方法的参数是空,所以必须将null强制转为Class[]类型
		System.out.println(method.invoke(str1, (Object[])null));
							//invoke方法执行Method对象所调用的底层的方法,该方法的原型是
		
	}


这样终于成功的打印出“abcdefg”了。

 

 额,更正:

其实如果待反射的方法无参数,那就可以不写,所以正确的方式应该是这样:

private static void reflectMethod() throws Exception
	{
		String str1 = new String("ABCDEFG");
		Method method = String.class.getMethod("toLowerCase");
		System.out.println(method.invoke(str1));

	}




 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
Java反射机制可以通过Class来获取一个的信息,包括的名称、属性、方法等。以下是一个示例,演示如何使用Java反射来获取的信息: ```java import java.lang.reflect.Field; import java.lang.reflect.Method; public class ReflectionDemo { public static void main(String[] args) throws Exception { // 获取Person的Class对象 Class personClass = Person.class; // 获取Person的public属性 Field[] fields = personClass.getFields(); for (Field field : fields) { System.out.println(field.getName()); } // 获取Person的所有属性 Field[] declaredFields = personClass.getDeclaredFields(); for (Field field : declaredFields) { System.out.println(field.getName()); } // 获取Person的public方法 Method[] methods = personClass.getMethods(); for (Method method : methods) { System.out.println(method.getName()); } // 获取Person的指定方法 Method method = personClass.getMethod("eat", String.class); System.out.println(method.getName()); // 创建Person对象 Person person = new Person(); // 调用Person对象的eat方法 method.invoke(person, "apple"); } } class Person { public String name; private int age; public void eat(String food) { System.out.println("I am eating " + food); } } ``` 在上面的示例中,我们首先获取了Person的Class对象,然后使用Class对象的getFields和getDeclaredFields方法获取的属性信息,使用getMethods方法获取的方法信息,使用getMethod方法获取指定方法的信息。最后,我们创建了一个Person对象,并使用反射机制调用了Person对象的eat方法。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值