Java反射机制

一、什么是反射?

Java反射说的是在运行状态中,对于任何一个类,我们都能够知道这个类有哪些方法和属性。对于任何一个对象,我们都能够对它的方法和属性进行调用。我们把这种动态获取对象信息和调用对象方法的功能称之为反射机制。

二、反射的三种方式

这里需要跟大家说一下,所谓反射其实是获取类的字节码文件,也就是.class文件,那么我们就可以通过Class这个对象进行获取。

1、第一种方式

在这里插入图片描述
这个方法其实是Object的一个方法,Class继承了Object,所以我们可以直接使用。

在这里插入图片描述
2、第二种方式

在这里插入图片描述
3、第三种

这里需要注意,通过类的全路径名获取Class对象会抛出一个异常,如果根据类路径找不到这个类那么就会抛出这个异常。

在这里插入图片描述
那么这3中方式我们一般选用哪种方式呢?第一种已经创建了对象,那么这个时候就不需要去进行反射了,显得有点多此一举。第二种需要导入类的包,依赖性太强。所以我们一般选中第三种方式。

三、通过反射获取类的构造方法、方法以及属性

public static void main(String[] args){
    String className = "com.cn.usermanage.entity.AppraiseBase";
    try{
		Class baseClass = Class.forName(className);
		//获取所有的公用的构造方法
		//Constructor[] cons = baseClass.getConstructors(); 
		//获取所有的构造方法
		//Constructor[] cons = baseClass.getDeclaredConstructors();
		//for(Constructor con : cons){
		//	System.out.println(con);
		//}
		//获取公有 & 有参的构造方法
		//Constructor cons = baseClass.getConstructor(new Class[]{Long.class,String.class});
		//获取私有 & 有参的构造方法
		//Constructor cons = baseClass.getDeclaredConstructor(new Class[]{Long.class,String.class});
		//System.out.println(cons);
		//获取所有公有字段
		//Field[] fields = baseClass.getFields();
		//获取所有私有字段
//			Field[] fields = baseClass.getDeclaredFields();
//			for(Field field : fields){
//				System.out.println(field);
//			}
			//获取指定的私有字段
			//Field field = baseClass.getDeclaredField("userId");
			//获取一个公有的构造方法,实例化
//			Object obj = baseClass.getConstructor().newInstance();
//			field.setAccessible(true);//设置私有字段的值需要进行暴力破解	
//			field.set(obj,1L);
//			AppraiseBase appraiseBase = (AppraiseBase)obj;
//			System.out.println(appraiseBase.getUserId());
			//获取所有公有方法
			//Method[] methods = baseClass.getMethods();
			//获取所有方法
//			Method[] methods = baseClass.getDeclaredMethods();
//			for(Method method : methods){
//				System.out.println(method);
//			}
			//获取指定方法
//			Method method = baseClass.getDeclaredMethod("test2",String.class);
//			System.out.println(method);
			//获取构造方法,实例化
//			Object obj = baseClass.getConstructor().newInstance();
//			method.setAccessible(true);
//			Object invoke = method.invoke(obj,"123");
//			System.out.println(invoke);
			
		}catch (Exception e){
	    	e.printStackTrace();
		}
	   
	}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值