通过反射操作成员方法

阅读:269

目录介绍

  • 01.指定一个student类
  • 02.反射调用公有方法
  • 03.反射调用私有方法

01.指定一个student类

  • 修改Student类,将get方法都指定为公有的,将set方法指定为私有的
    public class Student {
    
    	private String name;
    
    	private int age;
    
    	public Student() {
    
    	}
    
    	public Student(String name, int age) {
    		this.name = name;
    		this.age = age;
    	}
    
    	public String getName() {
    		System.out.println("调用了getName方法,Name:" + name);
    		return name;
    	}
    
    	public int getAge() {
    		System.out.println("调用了getAge方法,Age:" + age);
    		return age;
    	}
    
    	private void setName(String name) {
    		this.name = name;
    		System.out.println("调用了setName方法,name:" + name);
    	}
    
    	private void setAge(int age) {
    		this.age = age;
    		System.out.println("调用了setAge方法,age:" + age);
    	}
    }
    

02.反射调用公有方法

  • java.lang.reflect.Method 实例是方法的代表对象,可以使用 invoke() 方法来动态调用指定的方法
  • 首先来调用公有方法
    public class Main {
    
    	public static void main(String[] args) throws Exception {
    		Class cl = Class.forName("net.zhifou.demo.Student");
    		// 指定构造函数
    		Constructor constructor = cl.getConstructor(String.class, Integer.TYPE);
    		// 根据指定的构造函数来获取对象
    		Object object = constructor.newInstance("hello", 25);
    
    		// 指定方法名称来获取对应的公开的Method实例
    		Method getName = cl.getMethod("getName");
    		// 调用对象object的方法
    		getName.invoke(object);
    
    		// 指定方法名称来获取对应的公开的Method实例
    		Method getAge = cl.getMethod("getAge");
    		// 调用对象object的方法
    		getAge.invoke(object);
    
    	}
    }
    

  • 输出结果如下所示,可以知道Student对象的两个get方法成功被调用了。
    调用了getName方法,Name:hello
    调用了getAge方法,Age:25
    

03.反射调用私有方法

  • 一般情况下,类的私有方法只有在其内部才可以被调用,通过反射我们可以来突破这一限制
  • 受保护或私有方法的调用步骤略有不同
    public class Main {
    	public static void main(String[] args) throws Exception {
    		Class cl = Class.forName("net.zhifou.demo.Student");
    		// 指定构造函数
    		Constructor constructor = cl.getConstructor(String.class, Integer.TYPE);
    		// 根据指定的构造函数来获取对象
    		Object object = constructor.newInstance("tom", 25);
    
    		// 指定方法名称来获取对应的私有的Method实例
    		Method setName = cl.getDeclaredMethod("setName", String.class);
    		setName.setAccessible(true);
    		setName.invoke(object, "jack");
    		
    		// 指定方法名称来获取对应的私有的Method实例
    		Method setAge = cl.getDeclaredMethod("setAge", Integer.TYPE);
    		setAge.setAccessible(true);
    		setAge.invoke(object, 100);
    	}
    }
    


  • 输出结果如下所示,可以看到私有方法一样在外部被调用了
    调用了setName方法,name:jack
    调用了setAge方法,age:100

赞赏支持


精彩留言

发表评论