Java方法的反射(对反射的进一步认识)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq78442761/article/details/88049297

目录

 

 

理论

实例


 

理论

这是学Java反射的第三天了,今天对Java反射有了新的认识,个人觉得,Java的反射,实际上是存在一个对象的副本。这个对象的副本实际上是一个Class指针(Java里面没有指针的概念,这里为了理解,特意搬出来的),然而这个Class指针估计是保存在Java虚拟机里面的,都会存在对象的类类型的指针到Java虚拟机里面,因为在Java中,处处都是对象,连函数也是对象。所以可以直接调用函数方法。

方法的反射

如何获取某个方法:方法的名称和方法的参数列表才能唯一决定某个方法。

【注意,Java不是C++,函数的返回值不同的话,也是相同的函数】

方法反射的操作:method.invoke(对象, 参数列表)

实例

程序结构如下:

运行截图如下:

源码如下!

MethodDemo.java

package my;

import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;

public class MethodDemo {

	public static void main(String[] args) {
		
		/**
		 * 获取类的方法,首先要获取类的类型
		 */
		Test a1 = new Test();
		Class c = a1.getClass();
		
		/**
		 * 获取方法 名称和参数列表来决定
		 * getMethod获取的是public方法
		 * getDelcaredMethod是自己声明的方法
		 */
		try {
			Method m = c.getMethod("print", new Class[] {int.class, int.class});
			//Method m = c.getMethod("print", int.class, int.class);
			/**
			 * 使用invoke进行反射的调用
			 */
			try {
				Object o = m.invoke(a1, new Object[] {10, 20});
				
				//方式二
				o = m.invoke(a1, 20, 30);
				
				System.out.println("----------华丽的分割线----------");
				Method mStr = c.getMethod("print", new Class[] {String.class, String.class});
				o = mStr.invoke(a1, new String[]{"how", "are"});
				
				System.out.println("----------华丽的分割线----------");
				Method mNull = c.getMethod("print");
				mNull.invoke(a1);
				
			}
			catch (IllegalAccessException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			} 
			catch (IllegalArgumentException e) {
				// TODO Auto-generated catch block 
				e.printStackTrace();
			} 
			catch (InvocationTargetException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		} 
		catch (NoSuchMethodException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} 
		
		
		
	}
}

class Test{
	
	public void print() {
		
		System.out.println("helloWorld");
	}
	
	public void print(int a, int b) {
		
		System.out.println(a + b);
	}
	
	public void print(String a, String b) {
		
		System.out.println(a.toUpperCase() + "," + b.toUpperCase());
	}
	
	
}

猜你喜欢

转载自blog.csdn.net/qq78442761/article/details/88049297