`

getMethods

阅读更多
针对以前看过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是一样的,程序实际上不知道会执行哪一个。
分享到:
评论

相关推荐

    class.getMethods()

    在Java编程语言中,`Class.getMethods()`是一个非常重要的方法,它属于`java.lang.Class`类。这个方法用于获取指定类或接口的所有公共方法,包括继承自超类和实现的接口的方法。`getMethods()`返回一个`Method`对象...

    java中Class.getMethods()和Class.getDeclaredMethods()方法的区别

    Java 中 Class.getMethods() 和 Class.getDeclaredMethods() 方法的区别 Java 中的 Class.getMethods() 和 Class.getDeclaredMethods() 是两个常用的方法,它们都可以用来获取某个类的方法,但是它们之间存在着一些...

    用反射的方式获取父类中的所有属性和方法

    类似地,我们使用`getMethods()`获取public方法,`getDeclaredMethods()`获取所有方法,包括私有: ```java Method[] methods = superClass.getDeclaredMethods(); for (Method method : methods) { System....

    C# 抽象接口委托反射等技术详解

    在这个例子中,使用 `GetType()` 方法获取 `ReflectionExample` 类的类型信息,并使用 `GetMethods()` 方法获取该类的所有公共静态方法。接着使用 `Activator.CreateInstance` 方法动态创建 `ReflectionExample` 类...

    springboot schedule 解决定时任务不执行的问题

    Method[] methods = BatchProperties.Job.class.getMethods(); int defaultPoolSize = 3; int corePoolSize = 0; if (methods != null && methods.length > 0) { for (Method method : methods) { Scheduled ...

    frida反射调用对象中的方法与字段.pdf

    本文主要讲解了在遇到需要操作Java对象的参数或返回值时,如何利用Frida这一动态代码插桩工具来进行反射调用,包括调用对象的方法和获取对象的字段。Frida是一个强大的动态代码插桩工具,它可以注入到几乎所有的进程...

    PHP反射类ReflectionClass和ReflectionObject的使用方法

    例如,我们可以使用`ReflectionClass::getName()`获取类名,`ReflectionClass::getMethods()`获取所有方法,`ReflectionClass::getProperties()`获取所有属性。在示例中,`$reflect = new ReflectionClass($test);`...

    LINQ中文教程(重新整理)

    - **查询字符串类型的方法**: 使用`GetMethods`方法获取字符串类型的所有成员方法,并筛选出非静态方法。 ```csharp var result = from m in typeof(string).GetMethods() where m.IsStatic != true select m....

    javassist3.19GA.jar

    Javassist的最外层的API和JAVA的反射包中的API颇为类似。它使你可以在装入ClassLoder之前,方便的查看类的结构。它主要由CtClass,,CtMethod,,以及...比如getName,getSuperclass,getMethods,,getSignature,等等

    反射获取jar文件中的类

    这个方法使用了 JarFile 和 JarEntry 来获取 jar 文件中的所有类,然后使用 URLClassLoader.loadClass 方法加载类,并使用 getMethods 方法获取类中的方法。 反射的应用 反射机制有很多应用,例如: * 动态代理:...

    Java面试题目集锦

    例如,`Class`的`newInstance()`方法可以用来创建类的新实例,而`getMethods()`、`getFields()`等方法用于获取类的成员方法和字段。反射API广泛用于框架开发、动态代理和测试工具中。 8. 使用反射的步骤: - 获取`...

    JAVA中的反射机制(内含大量实例)

    `Class`对象提供了获取类信息的各种方法,如`getConstructors()`获取构造函数,`getMethods()`获取所有公共方法,`getFields()`获取字段。 例如,以下代码展示了如何使用反射获取并打印出`java.util.Stack`类的所有...

    java反射,获取所有属性、方法以及List集合类

    与获取字段类似,我们可以使用`getMethods()`获取所有公有方法,`getDeclaredMethods()`获取所有方法,包括私有。返回的是`Method`对象数组。 ```java Method[] methods = clazz.getMethods(); // 获取公有方法 ...

    java框架知识点汇总(反射,XML,设计模式,Redis缓存数据库)

    对于Java开发人员来说,实际工作中使用最多的就是各种框架技术,可以说,框架技术是求职者的必备技能。要想更好地学习并掌握框架技术,就需要了解实现框架的各种底层技术...另外,还可以调用 getFields() getMethods

    Java反射学习.pdf

    使用 Class.forName() 方法可以获取类的对象,然后使用 getMethods() 方法可以获取类的所有方法,包括从父类继承过来的方法。 方法反射 Java 反射可以获取方法的信息,例如方法的名称、方法的参数类型、方法的返回...

    Linq中文教程

    - **解释**: 这段代码首先获取 `string` 类的所有方法 (`GetMethods`),然后使用 LINQ 查询来筛选出所有非静态方法,并将其名称保存到 `result` 变量中。这里 `var` 关键字表示变量类型将由编译器根据上下文自动...

    通过反射获取类和方法.zip

    获取类的方法通常使用`getMethods()`或`getMethod(String name, Class<?>... parameterTypes)`。`getMethods()`返回类及其所有父类中声明的所有公共方法,而`getMethod()`则根据方法名和参数类型精确匹配方法。例如...

    C#写的反射器,模拟反射机制

    return type.GetMethods(BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.Static); } ``` 3. **实例化对象**:使用Activator.CreateInstance()或Type的ConstructorInfo来...

    java反射获取所有属性,获取所有get方法,包括子类父类

    `getMethods()` 返回所有公共方法,包括从超类继承的方法,而 `getDeclaredMethods()` 只返回当前类声明的方法。 ```java Class<?> clazz = Class.forName("全限定类名"); Method[] methods = clazz.getMethods...

    快速掌握LINQ最新教程

    1. **获取方法列表**:`typeof(string).GetMethods()` 获取 `string` 类的所有方法。 2. **查询表达式**:`from m in methods where m.IsStatic != true select m.Name` 表示从 `methods` 数组中选取非静态的方法名...

Global site tag (gtag.js) - Google Analytics