Java反射机制

本文深入探讨了Java反射机制的原理与应用,包括获取类的字节码对象、动态获取类的内容、字段的获取与设置、构造器的获取、方法的获取等核心功能。通过实例演示了如何在Java中灵活运用反射机制,解决动态获取类和方法的问题,为开发者提供了强大的编程能力。

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


1、反射机制:对一个类进行动态的获取并创建对象,并调用该类中的内容。

2、应用程序
1.在不明白日后出现什么样的实现类时,可以扩展出去,对外提供配置文件,让后期的实现类都定义在配置文件中。

2.该程序中会读取配置文件并根据指定的名字找寻具体对应的类。

3.对找到的类进行对象的建立。

4.并调用该类对象的成员。

是不是在动态的获取指定的类,是!
是不是在调用类中的成员。
这就是反射技术。

3、用于描述字节码文件的类名称就是Class

4、只要获取到字节码文件对象。就可以获取该字节码中所有的内容
这就是动态的获取类中的内容,并使用

如何获取到字节码文件对象呢?

5、反射机制:对一个类进行动态的获取并创建对象,并调用该类中的内容。

获取字节码文件对象的方式。

方式一:对象调用 使用Object类中的getclass方法。
该方式必须先创建未知类的对象,再调用getclass方法。

	public static void getClassDemo1() {
		Person p1 = new Person();
		Person p2 = new Person();

		Class clazz1 = p1.getClass();
		Class clazz2 = p2.getClass();

		System.out.println(clazz1 == clazz2);
	}
------------------------------------------------------------------------

方式二:类名调用 使用静态的class属性就可以获取
Class clazz=Person.class;

该方式还是需要使用未知的类。
------------------------------------------------------------------------

方式三:通过Class类中的静态方法forName(className)完成;
爽!只要通过类名就可以获取到对应的字节码文件对象。这种方式的扩展性是最好的。

forName:1.根据传入的类的名称,自动去classPath路径下去寻找与该类名称相同的类文件。
2.通过加载器将该类进行加载,并在内存中生成该类的字节码文件对象。

	/**
	 * 方式三:
	 * @throws ClassNotFoundException
	 */
	public static void getClassDemo3() throws ClassNotFoundException {

		String className = "cn.itcast.bean.Person";// 注意名称是全名

		Class clazz = Class.forName(className);// 放射机制的基本核心

		System.out.println(clazz);
	}

6、 字段的获取设置
AccessibleObject 取消权限检查
	public static void getFieldDemo() throws ClassNotFoundException,
			NoSuchFieldException, SecurityException, InstantiationException,
			IllegalAccessException {
		String className = "cn.itcast.bean.Person";
		/*
		 * 获取指定类中的指定名称的字段 思路: 1.通过类名获取字节码文件对象 2.通过字节码文件对象获取其中的成员字段。
		 */
		// 1.获取字节码文件对象
		Class clazz = Class.forName(className);

		// 2.通过Class对象的方法获取字段。
		// Field field = clazz.getField("age");// 只能获取公共的字段
		Field field = clazz.getDeclaredField("age");

		Object obj = clazz.newInstance();

		// 取消权限检查
		field.setAccessible(true);// 暴力访问,不建议此方法访问

		// 对字段进行值得设置,需要使用字段对象来完成
		field.set(obj, 30);

		System.out.println(field.get(obj));
		System.out.println(field);
	}

7、 获取构造器
	public static void getConstructorDemo() throws ClassNotFoundException, NoSuchMethodException, SecurityException, InstantiationException, IllegalAccessException, IllegalArgumentException, InvocationTargetException {
		
		String className="cn.itcast.bean.Person";
		Class clazz=Class.forName(className);
		//之前通过newInstance进行指定类的实例化。但是该类中如果没有空参数构造函数呢?
		//或者想通过指定的构造函数进行该类对象实例化呢?
		/*
		 * 1.必须先要获取指定的构造函数。
		 * 2.通过获取到的构造函数对对象进行初始化。
		 */
		//1.获取构造器对象
		Constructor constructor=clazz.getConstructor(String.class,int.class);
		
		//2.如何初始化,构造器最清楚
		Object obj=constructor.newInstance("lisi",20);
	}

8、 获取方法。获取公有,空参数的方法;
	public static void getMethodDemo() throws Exception {
		String className = "cn.itcast.bean.Person";
		Class clazz = Class.forName(className);
		
		//获取指定类中的指定的方法
		Method method =clazz.getMethod("show", null);
		
		//获取指定的对象
		Object obj=clazz.newInstance();
		
		//调用方法对象的invoke方法。
		method.invoke(obj, null);
	}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值