针对以前看过override和overload的区别,正面理解起来很容易,最近看了reflect之后也可以用另外一种思路理解,也许这样理解更彻底些。
首先是引用博客里的:
getDeclaredMethod*()获取的是类自身声明的所有方法,包含public、protected和 private方法。getMethod*()获取的是类的所有共有方法,这就包括自身的所有public方法,和从基类继承的、从接口实现的所有public方法。要获得父类的不是public的方法只有递归到父类再getDeclaredMethod*(),要是invoke父类的私有或者普通(不是public)的方法需要设置method.setAccessible(true)。
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
public class cl {
public static void main(String[] args) throws IllegalArgumentException, IllegalAccessException, InvocationTargetException {
cl c=new cl();
try {
//c.getClass().getMethod("prt", a.class).invoke(c, new a());
// Method[] mm= c.getClass().getMethods();//这里得到11个
// length :11
// name prt
// name main
// name wait
// name wait
// name wait
// name hashCode
// name getClass
// name equals
// name toString
// name notify
// name notifyAll
Method[] mm= c.getClass().getDeclaredMethods();//这里得到自身类里的方法,共3个
// length :3
// name prt
// name main
// name p
System.out.println("length :"+mm.length);
for(Method m1:mm){
String sss= m1.getName();
System.out.println("name "+sss.toString());
}
} catch (SecurityException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public void prt(a s){
s.p();
}
private void p(){
}
}
下面关于invock():
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
public class cl {
public static void main(String[] args) throws IllegalArgumentException, IllegalAccessException, InvocationTargetException {
cl c=new cl();
try {
try {
c.getClass().getMethod("prt", a.class).invoke(c, new a());
} catch (NoSuchMethodException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
} catch (SecurityException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public void prt(a s){//这里a是一个类
s.p();
}
private void p(){
}
}
第一个参数是方法名prt,
c.getClass().getMethod("prt", a.class).invoke(c, new a());
并且prt必须是c中的共有方法
第二个参数是传入该方法中的参数class[]集合, c是指调用该方法的实例,new a()是指该方法的具体参数值
这里需要说明的是要传入的是8种基本类型class[]也要是他们的封装类型集合, 另外就是如果不是public方法,调用会有异常。
说明 :overload的参数为什么要类型不一样,就是这里class[]能看出来的 ,如果类型一样的也可以覆盖,那么这里class是一样的,程序实际上不知道会执行哪一个。
分享到:
相关推荐
在Java编程语言中,`Class.getMethods()`是一个非常重要的方法,它属于`java.lang.Class`类。这个方法用于获取指定类或接口的所有公共方法,包括继承自超类和实现的接口的方法。`getMethods()`返回一个`Method`对象...
Java 中 Class.getMethods() 和 Class.getDeclaredMethods() 方法的区别 Java 中的 Class.getMethods() 和 Class.getDeclaredMethods() 是两个常用的方法,它们都可以用来获取某个类的方法,但是它们之间存在着一些...
类似地,我们使用`getMethods()`获取public方法,`getDeclaredMethods()`获取所有方法,包括私有: ```java Method[] methods = superClass.getDeclaredMethods(); for (Method method : methods) { System....
在这个例子中,使用 `GetType()` 方法获取 `ReflectionExample` 类的类型信息,并使用 `GetMethods()` 方法获取该类的所有公共静态方法。接着使用 `Activator.CreateInstance` 方法动态创建 `ReflectionExample` 类...
Method[] methods = BatchProperties.Job.class.getMethods(); int defaultPoolSize = 3; int corePoolSize = 0; if (methods != null && methods.length > 0) { for (Method method : methods) { Scheduled ...
本文主要讲解了在遇到需要操作Java对象的参数或返回值时,如何利用Frida这一动态代码插桩工具来进行反射调用,包括调用对象的方法和获取对象的字段。Frida是一个强大的动态代码插桩工具,它可以注入到几乎所有的进程...
- **查询字符串类型的方法**: 使用`GetMethods`方法获取字符串类型的所有成员方法,并筛选出非静态方法。 ```csharp var result = from m in typeof(string).GetMethods() where m.IsStatic != true select m....
Javassist的最外层的API和JAVA的反射包中的API颇为类似。它使你可以在装入ClassLoder之前,方便的查看类的结构。它主要由CtClass,,CtMethod,,以及...比如getName,getSuperclass,getMethods,,getSignature,等等
这个方法使用了 JarFile 和 JarEntry 来获取 jar 文件中的所有类,然后使用 URLClassLoader.loadClass 方法加载类,并使用 getMethods 方法获取类中的方法。 反射的应用 反射机制有很多应用,例如: * 动态代理:...
例如,`Class`的`newInstance()`方法可以用来创建类的新实例,而`getMethods()`、`getFields()`等方法用于获取类的成员方法和字段。反射API广泛用于框架开发、动态代理和测试工具中。 8. 使用反射的步骤: - 获取`...
`Class`对象提供了获取类信息的各种方法,如`getConstructors()`获取构造函数,`getMethods()`获取所有公共方法,`getFields()`获取字段。 例如,以下代码展示了如何使用反射获取并打印出`java.util.Stack`类的所有...
与获取字段类似,我们可以使用`getMethods()`获取所有公有方法,`getDeclaredMethods()`获取所有方法,包括私有。返回的是`Method`对象数组。 ```java Method[] methods = clazz.getMethods(); // 获取公有方法 ...
对于Java开发人员来说,实际工作中使用最多的就是各种框架技术,可以说,框架技术是求职者的必备技能。要想更好地学习并掌握框架技术,就需要了解实现框架的各种底层技术...另外,还可以调用 getFields() getMethods
使用 Class.forName() 方法可以获取类的对象,然后使用 getMethods() 方法可以获取类的所有方法,包括从父类继承过来的方法。 方法反射 Java 反射可以获取方法的信息,例如方法的名称、方法的参数类型、方法的返回...
获取类的方法通常使用`getMethods()`或`getMethod(String name, Class<?>... parameterTypes)`。`getMethods()`返回类及其所有父类中声明的所有公共方法,而`getMethod()`则根据方法名和参数类型精确匹配方法。例如...
return type.GetMethods(BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.Static); } ``` 3. **实例化对象**:使用Activator.CreateInstance()或Type的ConstructorInfo来...
`getMethods()` 返回所有公共方法,包括从超类继承的方法,而 `getDeclaredMethods()` 只返回当前类声明的方法。 ```java Class<?> clazz = Class.forName("全限定类名"); Method[] methods = clazz.getMethods...
1. **获取方法列表**:`typeof(string).GetMethods()` 获取 `string` 类的所有方法。 2. **查询表达式**:`from m in methods where m.IsStatic != true select m.Name` 表示从 `methods` 数组中选取非静态的方法名...
MethodInfo[] methods = myType.GetMethods(BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance); foreach (MethodInfo method in methods) { Console.WriteLine("- " + method.Name); } ...
MethodBase[] methods = type.GetMethods(BindingFlags.Public | BindingFlags.Instance); foreach (MethodBase method in methods) { // 处理每个方法 } } ``` `BindingFlags`枚举用于指定搜索的范围,如公有...