一、Method
- Method 提供关于类或接口上单独某个方法(以及如何访问该方法)的信息。
- 所反映的方法可能是类方法或实例方法(包括抽象方法)。
- Method 允许在匹配要调用的实参与底层方法的形参时进行扩展转换;
- 但如果要进行收缩转换,则会抛出 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); } }
- 在上述例子中,启动java程序的main方法的参数是一个字符串数组,
- 即public static void main(String[]args),
- 通过反射方式来调用这个main方法时,如何为invoke方法传递参数呢?
- 按jdk1.5的语法,整个数组是一个参数,
- 而按jdk1.4的语法,数组中的每个元素对应一个参数,
- 当把一个字符串数组作为参数传递给invoke方法时,
- javac会到底按照哪种语法进行处理呢?
- jdk1.5肯定要兼容jdk1.4的语法,会按jdk1.4的语法进行处理,即把数组打散称为若干个单独的参数,
- 所以在main方法传递参数时,不能使用代码mainMethod.invoke(null,new String(“aaa”,”dddd”,”sss”)),
- javac只把它当作jdk1.4的语法进行理解,而不把它当作jdk1.5的语法解释,因此会出现wrong number of arguments
- 解决办法:
- mainMethod.invoke(null,new Object[](new String[]{‘’’’’’}
- 或者mainMethod.invoke(null,(Object)new String[]{‘’’’’’’’’’})
相关推荐
`InvocationTargetException`通常作为Java标准库中的`java.lang.reflect.Method.invoke()`方法的异常包装器。当目标方法抛出异常时,`invoke()`会捕获这个异常并封装为`InvocationTargetException`,然后将其抛出。...
在Java编程语言中,`java.lang.reflect`包是核心库的一部分,它提供了运行时访问类、接口、字段和方法的能力。这个包对于理解和操作对象的动态特性至关重要,尤其是在实现反射机制时。反射允许我们在程序运行期间...
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...
Caused by: java.lang.ClassNotFoundException: org.aspectj.weaver.reflect.ReflectionWorld$ReflectionWorldException at java.net.URLClassLoader$1.run(URLClassLoader.java:200) at java.security.Access...
3. **Java动态代理**:基于`java.lang.reflect.Proxy`和`java.lang.reflect.InvocationHandler`,实现对目标对象的代理,用于拦截方法调用。 综上所述,`NoSuchMethodException`是Java编程中需要关注的一个重要异常...
4. **`java.lang.reflect.Method`**:表示类的方法。 5. **`java.lang.reflect.Modifier`**:提供对成员的修饰符的访问。 ##### 基本使用方法 1. **获取成员方法信息**: - `Method[] getMethods()`:获取公开的...
java.lang.NullPointerException ... at java.lang.reflect.Method.invoke(Method.java:498) at org.apache.tomcat.websocket.pojo.PojoMessageHandlerWholeBase.onMessage(PojoMessageHandlerWholeBase.java:80)
1. 动态代理:使用`java.lang.reflect.Proxy`和`java.lang.reflect.InvocationHandler`可以创建动态代理对象,实现AOP(面向切面编程)。 2. 数据库操作框架:如MyBatis,通过反射动态生成SQL语句并执行。 3. XML...
java.lang.reflect.Constructor; java.lang.reflect.Field; java.lang.reflect.Method; java.lang.reflect.Modifier;
Class 类代表了 Java 中的一个类,而 java.lang.reflect 包提供了许多反射类,例如 Constructor、Method、Field 等。 Constructor 类代表了某个类中的一个构造方法。例如,我们可以使用 Class.forName("java.lang....
其中最经常使用的是三个类:java.lang.reflect.Field类、java.lang.reflect.Method类和java.lang.reflect.Constructor类。 Java.lang.reflect.Field类提供了有关类或接口的单个域的信息。利用这个类,我们可以得到...
`NoSuchMethodException`属于`java.lang.reflect`包,当反射API试图查找一个指定签名的方法而该方法不存在于目标类中时,会抛出此异常。这意味着在编译时存在该方法,但在运行时却由于某种原因(如类加载问题、方法...
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....
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....
用以执行和JDK反射API中java.lang.Class,,java.lang.reflect.Method,, java.lang.reflect.Method .Field相同的操作。这些类可以使你在目标类被加载前,轻松的获得它的结构,函数,以及属性。此外,不仅仅是在功能...
反射的核心类包括`java.lang.Class`、`java.lang.reflect.Field`、`java.lang.reflect.Method`和`java.lang.reflect.Constructor`。下面将详细阐述这些核心类以及反射的主要用法。 1. `java.lang.Class`:每个类在...
集成邮件工具类,用于发送某个应用的奔溃日志信息到邮箱。...at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:10
在Java中,反射主要涉及到`java.lang.Class`、`java.lang.reflect.Method`、`java.lang.reflect.Field`和`java.lang.reflect.Constructor`等类。下面将详细介绍这些知识点。 1. **反射的概述** 反射机制使得Java...
6. 反射:`java.lang.reflect`包包含了反射相关的类,如`Class`、`Method`、`Field`。深入源码,我们可以掌握如何在运行时动态地访问和修改类的信息。 7. I/O操作:`java.io`和`java.nio`包提供了丰富的I/O操作接口...