`

39、java.lang.reflect.Method

阅读更多

一、Method

 

  1. Method 提供关于类或接口上单独某个方法(以及如何访问该方法)的信息。
  2. 所反映的方法可能是类方法或实例方法(包括抽象方法)。 
  3. Method 允许在匹配要调用的实参与底层方法的形参时进行扩展转换;
  4. 但如果要进行收缩转换,则会抛出 IllegalArgumentException。

二、常用方法

 

 

public final class Method extends AccessibleObject implements GenericDeclaration, Member
{
	//按照声明顺序返回 Class 对象的数组,这些对象描述了此 Method 对象所表示的方法的形参类型。
	public Class<?>[] getParameterTypes(){}

	//以 String 形式返回此 Method 对象表示的方法名称
	public String getName(){}

	//返回一个 Class 对象,该对象描述了此 Method 对象所表示的方法的正式返回类型
	public Class<?> getReturnType(){}

	/**
	 * 对带有指定参数的指定对象调用由此 Method 对象表示的底层方法
	 * 个别参数被自动解包,以便与基本形参相匹配,基本参数和引用参数都随需服从方法调用转换。
	 * 如果底层方法是静态的,那么可以忽略指定的 obj 参数。该参数可以为 null
	 */
	public Object invoke(Object obj,
                     Object... args)
              throws IllegalAccessException,
                     IllegalArgumentException,
                     InvocationTargetException{}
}

 

三、示例

 

  • Method类代表某个类中的一个成员方法
  • 得到类中的某一个方法
  • 例子: Method charAt = Class.forName(“java.lang.String”).getMethod(“charAt”,int.class)
  • 调用方法
  • 通常方式:System.out.println(str.charAt(1));
  • 反射方式:System.out.println(charAt.invoke(str,1));
  • Jdk1.4和jdk1.5的invoke方法的区别
  • Jdk1.5:public Object invoke(Object obj,Object... args)
  • Jdk1.4:public Object invoke(Object obj,Object[] args),即按jdk1.4的语法需要将一个数组作为参数传递给invoke方法
package day23;

import java.lang.reflect.*;
/**
 * 写一个程序,这个程序能够根据用户提供的类名,去执行该类中的main方法
 */
public class ReflectDemo {
	public static void main(String[] args) throws Exception
	{
		String className = "day23.ArgumentTest";
		print(className);
	}

	private static void print(String className) throws Exception {
		Method mainMethod = Class.forName(className).getMethod("main", String[].class);
		//wrong number of arguments运行时会出现参数个数不对的异常
		//mainMethod.invoke(null, new String[]{"zhangsan","lisi","wangwu"});
		
		//解决办法
		mainMethod.invoke(null, (Object)new String[]{"zhangsan","lisi","wangwu"});
	}
}
class ArgumentTest
{
	public static void main(String[] args)
	{
		for(String str : args)
			System.out.println(str);
	}
}
  1. 在上述例子中,启动java程序的main方法的参数是一个字符串数组,
  2. 即public static void main(String[]args),
  3. 通过反射方式来调用这个main方法时,如何为invoke方法传递参数呢?
  4. 按jdk1.5的语法,整个数组是一个参数,
  5. 而按jdk1.4的语法,数组中的每个元素对应一个参数,
  6. 当把一个字符串数组作为参数传递给invoke方法时,
  7. javac会到底按照哪种语法进行处理呢?
  8. jdk1.5肯定要兼容jdk1.4的语法,会按jdk1.4的语法进行处理,即把数组打散称为若干个单独的参数,
  9. 所以在main方法传递参数时,不能使用代码mainMethod.invoke(null,new String(“aaa”,”dddd”,”sss”)),
  10. javac只把它当作jdk1.4的语法进行理解,而不把它当作jdk1.5的语法解释,因此会出现wrong number of arguments
  11. 解决办法:
  12. mainMethod.invoke(null,new Object[](new String[]{‘’’’’’}
  13. 或者mainMethod.invoke(null,(Object)new String[]{‘’’’’’’’’’})
分享到:
评论

相关推荐

    aop面向切面需要的jar包

    Caused by: java.lang.ClassNotFoundException: org.aspectj.weaver.reflect.ReflectionWorld$ReflectionWorldException at java.net.URLClassLoader$1.run(URLClassLoader.java:200) at java.security.Access...

    server frame base on c.rar

    java.lang.NullPointerException ... at java.lang.reflect.Method.invoke(Method.java:498) at org.apache.tomcat.websocket.pojo.PojoMessageHandlerWholeBase.onMessage(PojoMessageHandlerWholeBase.java:80)

    java 反射例子 代码

    java.lang.reflect.Constructor; java.lang.reflect.Field; java.lang.reflect.Method; java.lang.reflect.Modifier;

    ExcelExportUtils.java

    import java.lang.reflect.Method; import java.text.SimpleDateFormat; import java.util.Date; import java.util.List; import org.apache.poi.hssf.usermodel.HSSFWorkbook; import org.apache.poi.hssf.util....

    java Reflection 反射机制 反编译

    import java.lang.reflect.Method; import java.lang.reflect.Modifier; public class ReflectionTest { public static void main(String[] args) { Class c = null; try { c = Class.forName("java.lang....

    javassist3.19GA.jar

    用以执行和JDK反射API中java.lang.Class,,java.lang.reflect.Method,, java.lang.reflect.Method .Field相同的操作。这些类可以使你在目标类被加载前,轻松的获得它的结构,函数,以及属性。此外,不仅仅是在功能...

    android 奔溃日志收集 发送邮件到邮箱

    集成邮件工具类,用于发送某个应用的奔溃日志信息到邮箱。...at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:10

    jaxen.jar和dom4j.jar

    at java.lang.reflect.Method.invoke(Unknown Source) at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:44) at org.junit.internal.runners.model.ReflectiveCallable.run...

    java反射(reflect)

    java反射(reflect)

    org.eclipse.jdt.core_3.5.2.v_981_R35x

    at java.lang.reflect.Method.invoke(Method.java:597) at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:44) at org.junit.internal.runners.model.ReflectiveCallable....

    JavaSE-6.0-英文手册(2008/11/30_FullUpdate)

    java.lang.reflect java.math java.net java.nio java.nio.channels java.nio.channels.spi java.nio.charset java.nio.charset.spi java.rmi java.rmi.activation java.rmi.dgc java.rmi.registry java...

    Java高级程序设计实战教程第三章-Java反射机制.pptx

    //类的成员变量 java.lang.reflect.Method;//类的方法 java.lang.reflect.Modifier;//访问权限 Java高级程序设计实战教程第三章-Java反射机制全文共15页,当前为第6页。 3.2.4 使用反射机制的步骤 导入Jjava.lang....

    Java 高级特性.doc

    import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; import java.lang.reflect.Proxy; import java.util.Collection; import java.util.Vector; public class ProxyTest { public ...

    信息: Deploying web application directory lx01

    at java.lang.reflect.Method.invoke(Method.java:597) at org.apache.catalina.startup.Bootstrap.start(Bootstrap.java:289) at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:414) 2010-11-11 ...

    richfaces_erro

    at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:39) at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:27...

    COS——R.log

    at java.lang.reflect.Method.invoke(Method.java:585) at org.apache.axis.providers.java.RPCProvider.invokeMethod(RPCProvider.java:397) at org.apache.axis.providers.java.RPCProvider.processMessage...

    java反射机制

    import java.lang.reflect.Method; public class DumpMethods { public static void main(String args[]) throws Exception { // 加载并初始化命令行参数指定的类 Class&lt;?&gt; classType = Class.forName(args[0])...

    数据库工具类DatabaseUtil.java

    java.lang.reflect.Method method = clazz.getMethod("close", null); method.invoke(resource, null); } catch (Exception e) { // e.printStackTrace(); } } /** * 执行 SELECT 等 SQL 语句并返回结果集. ...

    c3p0工具包(jdbc)

    import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; import java.lang.reflect.Proxy; import javax.servlet.Filter; import javax.servlet.FilterChain; import javax.servlet....

    java业务层框架开发ibatis(java源码)

    import java.lang.reflect.Method; import java.sql.CallableStatement; import java.sql.Connection; import java.sql.DatabaseMetaData; import java.sql.PreparedStatement; import java.sql.SQLException; ...

Global site tag (gtag.js) - Google Analytics