欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Java反射

程序员文章站 2024-01-21 15:03:16
...

Java反射使用

通过反射构造对象,并使用反射调用方式访问对象的public/private方法和字段。

<!--EndFragment-->

public class TestBean {
	private String string;

	public TestBean() {
		System.out.println("无参构造方法被调用");
	}

	public TestBean(String string) {
		System.out.println("有参构造方法被调用");
		this.string = string;
	}

	public String getString() {
		System.out.println("属性获取被调用");
		return string;
	}

	public void setString(String string) {
		System.out.println("属性设置被调用过");
		this.string = string;
	}

	public void doPublic() {
		System.out.println("无参公共方法被调用过");
	}

	public String doPublic(String param1, Integer param2) {
		System.out.println("有参公共方法被调用过");
		return "参数1是:" + param1 + "  参数2是:" + param2.toString() + "  附加消息:" + string;
	}

	private String doPrivate() {
		System.out.println("无参私有方法被调用过");
		return "私有方法doPrivate()被调用了!";
	}

	private String doPrivate(String param) {
		System.out.println("有参私有方法被调用过");
		return "参数是" + param + "附加消息:" + string;
	}
}

 

import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.*;

public class Test {
	public static void main(String[] args) throws NoSuchMethodException,
			InvocationTargetException, IllegalAccessException,
			InstantiationException, NoSuchFieldException {
		// 通过反射方式创建对象
		Class clazz = TestBean.class; //这一步是第一步,就是获取Class类
		//通过获取构造函数来创建对象,还有其它方法
		TestBean testBean = (TestBean) clazz.getConstructor().newInstance();

		// 直接调用属性设置方法
		testBean.setString("通过Class方式创建一个对象,并调用对象上的方法!");

		// 通过反射方式调用属性设置方法
		//这一步是获取方法实例,和声明方法一样,我们需要有方法名,参数类型,感觉很像C语言中的头文件
		Method m_setString = clazz.getMethod("setString", String.class);
		//通过invoke来执行方法,这个invoke的功能很想JavaScript中的apply
		m_setString.invoke(testBean, "通过反射调用了testBean对象上的一个方法!");

		// 通过反射方式调用对象的带参public方法
		Method m_public = clazz.getMethod("doPublic", String.class,
				Integer.class);
		String re = (String) m_public.invoke(testBean, "张三", 200);
		System.out.println(re);

		// 通过反射方式调用对象的无参public方法
		m_public = clazz.getMethod("doPublic");
		re = (String) m_public.invoke(testBean);
		System.out.println(re);

		// 通过反射方式调用对象的带参private方法
		Method m_private = clazz.getDeclaredMethod("doPrivate", String.class);
		m_private.setAccessible(true); //注意这里,所有的私有方法和字段,都需要这个方法
		m_private.invoke(testBean, "张三");

		// 通过反射方式调用对象的无参private方法
		m_private = clazz.getDeclaredMethod("doPrivate");
		m_private.setAccessible(true);
		m_private.invoke(testBean);

		// 通过反射方式访问对象private字段
		Field f_private = clazz.getDeclaredField("string");
		f_private.setAccessible(true);
		f_private.set(testBean, "hahahahahahahaha");
		System.out.println(testBean.getString());
	}
}