反射第四步 : 通过反射获取某一个类的 方法 并通过反射调用

本文深入讲解了Java反射机制的应用,包括如何使用反射获取类的方法、构造器等,并演示了通过反射调用私有方法的过程。此外,还介绍了如何获取方法的返回类型及修饰符。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

package cn.sdut.reflectclass;

import java.lang.reflect.Constructor;
import java.lang.reflect.Method;
import java.lang.reflect.Modifier;
import java.util.Arrays;

	/*
	* 反射第四步 :   通过反射获取某一个类的 方法     并通过反射调用
	* 
	* 			带有 “Declared”的方法  无论什么访问权限的方法都可访问
	* 			不带有 “Declared”的方法  只可访问public的方法	
	*/
class B{
	
	public void show1(){
		System.out.println("show1");
	}
	public void show2(int a){
		System.out.println("show2"+a);
	}
	private void show3(String[] b){
		System.out.println("show3"+Arrays.toString(b));
	}
	
	public static void show4(){
		System.out.println("静态");
	}
	
}
public class ReflectDemo04 {

	public static void main(String[] args) throws Exception {
		//1.获取B的Class对象
		Class clz = Class.forName("cn.sdut.reflectclass.B");//换了一种方式,取得B的Class对象
		/*
		 * 2.获取所有无论访问权限的方法。
		 * getDeclaredMethods() 返回 Method 对象的一个数组,这些对象反映此 Class 对象表示的类或接口声明的所有方法,包括公共、保护、默认(包)访问和私有方法,但不包括继承的方法。
		 * getMethods()返回一个包含某些 Method 对象的数组,这些对象反映此 Class 对象所表示的类或接口(包括那些由该类或接口声明的以及从超类和超接口继承的那些的类或接口)的公共 member 方法。
		 */	
		Method[] m = clz.getDeclaredMethods();
		for (Method method : m) {
			System.out.println(method);
		}
		//3.获取一个方法并调用  
		Constructor<B> cb = clz.getDeclaredConstructor();//通过反射获得默认构造器  访问权限是default 所以用"Declared"
		B b = cb.newInstance();//创建实例对象
		Method m1 = clz.getMethod("show2",int.class);//获得方法
		m1.invoke(b,new Object[]{10});//塞进实例和参数  调用方法完成     打印输出:show210
		Method m2 = clz.getDeclaredMethod("show3",String[].class);//获得方法
		m2.setAccessible(true);
		m2.invoke(b,new Object[]{new String[]{"1","2","x"}});//塞进实例和参数  调用方法完成     打印输出:show3[1, 2, x]
		//4: 获取方法的返回值 
		Class returnType = m1.getReturnType();
		System.out.println(returnType);
		//5:获取方法的修饰符
		int modifiers = m2.getModifiers();
		Modifier mo = new Modifier();
		String str = mo.toString(modifiers);
		System.out.println(str);
		
		//访问静态方法
		Method m4 = clz.getMethod("show4",null);//获得方法
		m4.invoke(null,new Object[]{});//静态方法 不需要实例对象 第一个参数为null  
		
		//....还有获取参数的类型,各式各样可以去看API
		}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值