今天在程序中用到java反射机制时,遇到的问题记录一下:我当时遇到的问题是,我用反射getMethod()调用类方法时,发生 NoSuchMethodException异常,后来上网发现getMethod()调用公共方法,不能反射调用私有方法,后来找到 getDeclaredField()能够访问本类中定义的所有方法。后来用这个方法解决了我遇到的问题。我查了java api文档,其中详细说明如下:
Method getDeclaredMethod(String name, Class… parameterTypes)d
返回一个 Method 对象,该对象反映此 Class 对象所表示的类或接口的指定已声明方法。
Method[] getDeclaredMethods()
返回 Method 对象的一个数组,这些对象反映此 Class 对象表示的类或接口声明的所有方法,包括公共、保护、默认(包)访问和私有方法,但不包括继承的方法。
Method getMethod(String name, Class… parameterTypes)
返回一个 Method 对象,它反映此 Class 对象所表示的类或接口的指定公共成员方法。
Method[] getMethods()
返回一个包含某些 Method 对象的数组,这些对象反映此 Class 对象所表示的类或接口(包括那些由该类或接口声明的以及从超类和超接口继承的那些的类或接口)的公共 member 方法。
getDeclaredField(String name)
返回一个 Field 对象,该对象反映此 Class 对象所表示的类或接口的指定已声明字段。
Field[] getDeclaredFields()
返回 Field 对象的一个数组,这些对象反映此 Class 对象所表示的类或接口所声明的所有字段,包括公共、保护、默认(包)访问和私有字段,但不包括继承的字段。
Method getDeclaredMethod(String name, Class… parameterTypes)d
返回一个 Method 对象,该对象反映此 Class 对象所表示的类或接口的指定已声明方法。
Method[] getDeclaredMethods()
返回 Method 对象的一个数组,这些对象反映此 Class 对象表示的类或接口声明的所有方法,包括公共、保护、默认(包)访问和私有方法,但不包括继承的方法。
Method getMethod(String name, Class… parameterTypes)
返回一个 Method 对象,它反映此 Class 对象所表示的类或接口的指定公共成员方法。
Method[] getMethods()
返回一个包含某些 Method 对象的数组,这些对象反映此 Class 对象所表示的类或接口(包括那些由该类或接口声明的以及从超类和超接口继承的那些的类或接口)的公共 member 方法。
getDeclaredField(String name)
返回一个 Field 对象,该对象反映此 Class 对象所表示的类或接口的指定已声明字段。
Field[] getDeclaredFields()
返回 Field 对象的一个数组,这些对象反映此 Class 对象所表示的类或接口所声明的所有字段,包括公共、保护、默认(包)访问和私有字段,但不包括继承的字段。
相关推荐
Java反射机制是Java语言提供的一种强大的工具,它允许我们在运行时检查类、接口、字段和方法的信息,并且能够在运行时动态地创建对象和调用方法。这个特性在处理不确定类型的对象或者实现动态代理等场景中非常有用。...
Method rsMethod = rs.getClass().getDeclaredMethod(strName, String.class); m.invoke(o, rsMethod.invoke(rs, columnName)); } /** * 匹配指定列名的set方法 * @param o * @param column * @return * ...
由于私有方法在外部不可见,我们需要使用`getDeclaredMethod`而不是`getMethod`,并且可能需要设置访问权限: ```java Method privateMethod = MyClass.class.getDeclaredMethod("myPrivateMethod"); privateMethod...
这两个方法的区别在于,`getMethod()`会查找所有可访问的方法,包括父类的公开方法,而`getDeclaredMethod()`仅查找当前类中声明的方法,无论其访问级别如何。 在示例中,我们调用了`HashMap`类的`put`和`get`方法...
与`getMethod`类似,但`getDeclaredMethod`仅查找当前类声明的方法,而不考虑从超类继承的方法。这包括所有访问级别的方法,而不仅仅是公共的。 示例代码: ```java Class<?> clazz = String.class; Method method ...
3. 分别通过 `getDeclaredMethod` 方法获取 `Foo` 类的 `outInfo`、`setMsg` 和 `getMsg` 方法对象 `m1`、`m2` 和 `m3`。`getDeclaredMethod` 方法用于获取指定的私有或公共方法,而 `getMethod` 只获取公共方法。 4...
Method getMethod = clazz.getDeclaredMethod("get" + methodEnd, new Class[]{}); // 创建PropertyDescriptor return new PropertyDescriptor(propertyName, getMethod, setMethod); } return null; } ``` ...
在描述中提到的`getMethod()`和`invoke()`方法是反射的核心组成部分。`getMethod()`是`Class`类的一个方法,用于获取指定类的所有公共方法,如果需要获取私有方法,应使用`getDeclaredMethod()`。`invoke()`方法则是...
2. **使用`Class.getMethod()`与`Class.getDeclaredMethod()`**:`getDeclaredMethod()`会查找包括私有在内的所有方法,而`getMethod()`只查找公共方法。如果不需要访问私有方法,优先使用`getMethod()`,因为它的...
类似的,`Class`对象也提供了`getMethod`和`getDeclaredMethod`来获取公共方法和声明的方法。一旦获取到`Method`对象,我们可以使用`invoke`方法来调用这个方法,传递所需的参数。 6. ** introspection(内省)**...
4. **获取和调用方法**: `getMethod()`和`getDeclaredMethod()`方法用于获取公共方法和所有方法,包括私有方法。然后,使用`invoke()`方法可以调用这些方法。 5. **获取和设置字段**: 类似的,`getField()`和`...
2. 获取方法:使用`getMethod()`或`getDeclaredMethod()`,传入方法名和参数类型,获取`Method`对象。 3. 创建对象:如果需要,使用`Constructor.newInstance()`创建类的实例。 4. 调用方法:对获取到的`Method`对象...
要调用类的成员方法,首先需要通过Class对象的getMethod()或getDeclaredMethod()获取Method对象,这两个方法分别用于获取公共方法和所有声明的方法(包括私有和受保护的)。然后,我们可以通过Method对象的invoke()...
`Class`对象的`getMethod`和`getDeclaredMethod`方法用于获取特定签名的方法,其中`getMethod`只能访问公共方法,而`getDeclaredMethod`可以访问所有的方法,包括私有的和受保护的。 ### Hibernate如何利用反射 ...
对于方法的调用,反射提供了`getMethod()`和`getDeclaredMethod()`来获取公共方法和所有方法(包括私有、受保护和默认的)。一旦获取到`Method`对象,我们可以调用`invoke()`方法执行该方法,传入对象实例和参数。...
4. **调用方法**:通过`getMethod()`或`getDeclaredMethod()`获取Method对象,然后使用`invoke()`方法执行方法。例如: ```java Method method = myClass.getMethod("myMethod", argTypes...); method.invoke(my...
6. **调用方法**:讨论`getMethod()`、`getDeclaredMethod()`以及如何使用`invoke()`来调用方法,包括静态和非静态方法,以及处理参数和返回值。 7. **泛型与反射**:由于类型擦除,反射如何处理泛型类型。 8. **...
首先,通过`getMethod()`或`getDeclaredMethod()`找到对应的方法,然后调用`invoke()`执行方法。 ```java Method method = clazz.getMethod("methodName", argTypes...); method.invoke(obj, args...); ``` **5. ...
通过getMethod()和getDeclaredMethod()获取方法后,可以使用invoke()方法动态调用该方法,传入相应的参数。这允许我们在运行时调用未知的方法名或参数类型的方法。 4. **构造器的反射**: - 创建对象:Constructor...
`getMethod()`和`getDeclaredMethod()`用于获取指定名称和参数列表的方法。`invoke()`方法可以执行对应的方法,传入对象和参数即可。 4. `Constructor`类:`Constructor`表示类的构造方法。通过`getConstructor()`...