java反射机制的作用(代码展示)

java反射机制允许程序在运行时进行自我检查,同时也允许对其内部的成员变量进行操作。主要功能有:得到一个对象所属的类,获取一个类的所有成员变量和方法,在运行时创建对象,在运行时调用对象的方法。以下直接通过代码展示。

package functions;

import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;

public class ReflectTest {

	// 必须要public类型
	public String p1;
	public String p2;

	ReflectTest() {
		p1 = "1";
		p2 = "2";
	}

	public ReflectTest(String p1) {
		this.p1 = p1;
	}

	public ReflectTest(String p1, String p2) {
		this.p1 = p1;
		this.p2 = p2;
	}

	public void sayHello(String hello) {
		System.out.println(hello);
	}

	public static void main(String[] args) {
		try {
			/**
			 * 获取对象所属的类
			 * 
			 * 第1种方式:调用对象的getClass()方法
			 * 
			 * 第2种方式:调用类的Class方法
			 * 
			 * 第3种方式:Class.forName
			 */
			System.out.println("===获取一个对象所属的类,通常用第三种方式实现===");
			ReflectTest reflectTest = new ReflectTest();
			Class c1 = reflectTest.getClass();
			System.out.println(c1.getName());

			Class c2 = ReflectTest.class;
			System.out.println(c2.getName());

			// 必须传入完整的包名
			Class c3 = Class.forName("functions.ReflectTest");
			System.out.println(c3.getName());

			System.out.println("===获取Class对象的所有公有构造方法===");

			/**
			 * 获取Class对象的所有构造方法
			 */
			// 所有公有构造方法
			Constructor[] constructors1 = c1.getConstructors();
			for (Constructor constructor : constructors1) {
				System.out.println(constructor);
			}

			System.out.println("===获取Class对象的所有构造方法===");
			// 所有构造方法
			Constructor[] constructors = c1.getDeclaredConstructors();
			for (Constructor constructor : constructors) {
				System.out.println(constructor);
			}

			/**
			 * 获取成员变量
			 */
			System.out.println("===获取成员变量===");
			Field[] fields = c1.getDeclaredFields();
			for (Field field : fields) {
				System.out.println(field.getName());
			}

			/**
			 * 运行时创建对象
			 */
			System.out.println("===运行时创建对象===");
			ReflectTest reflectTest2 = (ReflectTest) c1.newInstance();
			System.out.println(reflectTest2.p2);

			/**
			 * 在运行时调用对象的方法
			 */
			System.out.println("===在运行时调用对象的方法===");
			Method m = c1.getMethod("sayHello", String.class);
			ReflectTest reflectTest3 = (ReflectTest) c1.newInstance();
			m.invoke(reflectTest2, "China");

			/**
			 * 运行时调用对象的属性
			 */
			System.out.println("===运行时调用对象的属性===");
			Field f = c3.getField("p1");
			ReflectTest reflectTest4 = new ReflectTest();
			f.set(reflectTest4, "2323");
			System.out.println(reflectTest4.p1);
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

}

结果如下:
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值