java 反射机制

本文深入讲解了Java反射机制的基本概念及使用方法,包括如何通过三种方式获取Class对象、如何使用反射来获取和操作成员变量、构造方法及成员方法,并演示了一个利用反射进行对象复制的例子。

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

一、 概述

JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。

二、反射的使用

1、 获取class的三种方式

//第一种
Man man1=new Man();
Class class1=man1.getClass();
//第二种
Class class2=Man.class;
//第三种
Class class3=Class.forName("xyz.eastgo.demo.Man");//类的路径

2、 通过反射获取成员变量(Field)并使用

                 Class manClass=Class.forName("xyz.eastgo.demo.Man");
                //获取所有公有的字段
		Field [] fields=manClass.getFields();
		for(Field field:fields){
			System.out.println("公有字段"+field.getName());
		}
		//获取所有 字段
		Field [] fields1=manClass.getDeclaredFields();
		for(Field field:fields1){
			System.out.println("所有字段"+field.getName());
		}

		//获得字段并使用  私有字段需用getDeclaredField()
		Object obj=manClass.newInstance();
		Field field=manClass.getDeclaredField("name");
		field.setAccessible(true);//解除私有限定
		field.set(obj, "root");
		Man man=(Man)obj;
		System.out.println(man.toString());

3、 反射获取构造方法并使用

        //反射获取构造方法并使用
		Object obj=manClass.newInstance();
		Constructor[] constructor = manClass.getConstructors();
		for(Constructor c:constructor){
			System.out.println(c);
		}
		Constructor con = manClass.getConstructor(String.class,String.class,int.class);//里面的参数是构造器的参数.class
		con.setAccessible(true);
		Man man=(Man)con.newInstance("tom","man",11);
		System.out.println(man.toString());

4、  获取成员方法并使用

        //获取所有公有成员方法
		Object obj=manClass.newInstance();
		Method[] method =manClass.getMethods();
		for(Method m:method){
			System.out.println(m);
		}
		System.out.println("1111");
		//获取所有成员方法
		Method[] methods =manClass.getDeclaredMethods();
		for(Method m:methods){
			System.out.println(m);
		}
        //获取方法并使用
        Object obj=manClass.newInstance();
		Method method=manClass.getDeclaredMethod("hidden", null);//方法名,方法的参数
		System.out.println(method);
		method.setAccessible(true);
		method.invoke(obj, null);//要设置参数的值

三、 利用反射复制对象

	public static void main(String[] args){

		Man man=new Man("tom","man",11);
		try {
			Man copyMan=(Man)copyBean(man);
			System.out.println(copyMan.toString());
		} catch (Exception e) {
			e.printStackTrace();
		}
		

	}	
public static Object copyBean(Object obj) throws Exception{
		Class<?> classT=obj.getClass();//被copy的类
		Object objRes=classT.newInstance();//要返回的copy的对象
		//首先获取源对象的Field
		Field[] fields=classT.getDeclaredFields();
		for(Field field:fields){
			System.out.println(field);
			//获取get和set方法名
			String getMethodName="get"+field.getName().substring(0, 1).toUpperCase()+field.getName().substring(1);
			String setMethodName="set"+field.getName().substring(0, 1).toUpperCase()+field.getName().substring(1);
			System.out.println(getMethodName+setMethodName);
			//获取get方法
			Method getMethod=classT.getDeclaredMethod(getMethodName, new Class[]{});
			//利用get方法获取源对象的属性值
			Object value=getMethod.invoke(obj,new Object[]{} );
			System.out.println(value);
			//获取set方法
			Method setMethod=classT.getDeclaredMethod(setMethodName, new Class[]{field.getType()});
			//利用set方法把上面用get方法获取的值set到要复制的对象中
			setMethod.invoke(objRes, new Object[]{value});		
		}
		return objRes;
	}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值