Java基础笔记32-反射

本文详细介绍了Java反射机制,包括如何通过Class类获取类信息、Method获取方法、Field获取属性以及Constructor获取构造器。通过实例展示了如何在运行时操作类和对象,是理解Spring框架核心原理的重要基础。
摘要由CSDN通过智能技术生成

Java基础笔记32-反射

  • 介绍
    • 反射是Java中一个非常重要的高级特性,基本上Spring等一系列框架都是基于反射的思想写成的。
    • Java反射机制是在程序运行过程中对于任何一个类,都能知道它的所有属性和方法,对于任意一个对象,都能喝知道调用它的任意属性和方法,这种动态获取信息以及鼎泰调用对象方法的功能称为Java语言的反射机制。
    • 利用反射机制可以在运行时判断任意一个对象所属的类,可以构造任意一个类的对象,可以判断任意一个类的成员属性和方法,可以调用任意一个对象的方法。
    • Java文件编译后生成的class文件(字节码文件)是唯一的,所有的对象都是通过class来创建,Class本身也是一个类型,类型就是Class,另外,所有的引用数据类型都具备一个class属性,所有的对象都有一个getClass()方法,对于基本数据类型也都有一个class属性(int.class)
    • Class类中包含的就是该类的所有属性及方法、类及类签名等信息
  • 常用的类
    • Class 用于获取类信息
    • Method 用于获取方法信息
    • Field 用于获取属性信息
    • constructor 用于获取构造器信息

代码示例:

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

public class ReflexDemo {
	public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException, SecurityException {
		reflexMethod4();
	}

	/**
	 * 获取.class文件中的 方法
	 * @throws ClassNotFoundException
	 * @throws SecurityException 
	 * @throws NoSuchMethodException 
	 */
	public static void reflexMethod4() throws ClassNotFoundException, NoSuchMethodException, SecurityException {
		Class itemCls = Class.forName("cn.yunhe.reflex.Item");
		//获取全部公共方法,包括继承的
		//Method[] method1 = itemCls.getMethods();
		//获取此类的全部公共方法,但不包括继承的
//		Method[] method2 = itemCls.getDeclaredMethods();
//
//		for(int i=0;i<method2.length;i++) {
//			System.out.println(method2[i]);
//		}
		//获取指定方法名的方法,需要指定方法名及参数类型,无参数,类型可不写会写null
		Method method3 = itemCls.getMethod("setName", String.class);
		Method method4 = itemCls.getMethod("getName",null);
		System.out.println(method3);
		System.out.println(method4);
	}

	/**
	 * 在只有.class文件的情况下获取此类的构造器信息
	 * 	 通常情况下在使用第三方的jar包时,能知道的仅仅是通过build path添加到功能的class文件的路径及名称
	 * 
	 * 包名+文件名
	 * 使用Class类中提供的方法:forName(String path)
	 * 
	 * @throws ClassNotFoundException
	 * @throws NoSuchMethodException
	 * @throws SecurityException
	 */
	public static void reflexMethod3() throws ClassNotFoundException, NoSuchMethodException, SecurityException {
		Class itemCls = Class.forName("cn.yunhe.reflex.Item");

		//获取所有公共的构造器
		Constructor[] cons1 = itemCls.getConstructors();
		System.out.println(cons1[0]);
		
		//获取所有的构造器包括私有的
		Constructor[] cons2 = itemCls.getDeclaredConstructors();
		
		for(int i=0;i<cons2.length;i++) {
			System.out.println(cons2[i]);
			System.out.println(cons2[i].getParameterCount());
		}
	}
		
	/**
	 * 每个类都有.class属性
	 */
	public static void reflexMethod2() {
		Class cls1 = User.class;
		Class cls2 = User.class;
		System.out.println(cls1 == cls2);//true
		
		Class cls3 = int.class;
		Class cls4 = Integer.class;
		System.out.println(cls3 == cls4);//false
	}
	/**
	 *  返回Class对象的方式一:getclass()
	 *  每一个引用数据类型都有一个getClass()方法,返回的就是该类的class对象
	 */
	public static void reflexMethod1() {
		User user =new User();
		Class cls = user.getClass();
		System.out.println(cls);//class cn.yunhe.reflex.User
		
		User user2 = new User();
		Class cls2 = user2.getClass();
		
		System.out.println(cls2);//class cn.yunhe.reflex.User             
		
		System.out.println(cls == cls2);//true
	}
}

class User{
	
	private  String name;
	private int age;
	public User() {}
	public User(String name, int age) {
		super();
		this.name = name;
		this.age = age;
	}
	public  String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public int getAge() {
		return age;
	}
	public void setAge(int age) {
		this.age = age;
	}
	@Override
	public String toString() {
		return "User [name=" + name + ", age=" + age + "]";
	}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值