Java的反射

Java的反射

今天学习spring时,遇到java反射的问题,写点自己查资料的收获;

什么是Class呢

首先Java中有一个特殊的Class类型的对象,一个Class对象包含了特定某个类的有关信息,如某个类实现了哪些接口,某个类的数据成员名,方法,构造器;Class类相当于是一个类反射之后得到对于这个类的描述类

Class中封装了描述方法信息的Method,描述字段的Field,描述构造器的Constructor

那么如何得到一个Class类呢?

  • 类名.class
  • Class.forName(“类名字符串”)(注:类名字符串是包名+类名
  • 实例对象.getClass()
//1.类加载器
ClassLoader classLoader = JdkProxy.class.getClassLoader();
//2.被代理对象实现的所有接口
Class<?>[] clazz = userDao.getClass().getInterfaces();

知道了这些后,我们可能会思考,为什么要使用反射呢?

  1. 有可能这个对象是别的方法传过来的,我们想动态处理
  2. 有可能没有对象,只有一个全类名

Reflection(反射)是Java被视为动态语言的关键,反射机制允许程序在执行期借助于Reflection API取得任何类的內部信息,并能直接操作任意对象的内部属性及方法。

Class类的常用方法

返回值 方法名说明
String getName()返回此Class对象所表示的实体(类,接口,数组类)的名称
Class<?>[] getInterfaces()获取当前Class对象实现的所有接口
ClassLoader getClassLoader()返回该类的类加载器
Object newInstance()调用缺省构造函数,返回该Class对象的一个实例
Object newInstance(Object []args)调用当前格式构造函数,返回该Class对象的一个实例
Class getSuperClass()返回当前Class对象的父类的Class对象

Class类中较为常见的是获取Method

Class clazz = Class.forName("com.atguigu.java.fanshe.Person");

//1.获取Clazz对应类,即Person中的所有方法,但不包括private方法和从父类继承来的所有方法
Method[] methods1 = clazz.getMethods();

//2.获取Clazz对应类中的所有声明的方法,包括私有方法,但不包括从父类继承来的方法
Method[] methods2 = clazz.getDeclaredMethod();

//3.获取指定的方法
//对于方法 public void setName(String name)
Method method3 = clazz.getDeclaredMethod("setName",String.class);
//对于方法public void setAge(int age)
Method method4 = clazz.getDeclaredMethod("setAge",int.class);

//4.method.invoke(Object obj,Object args)是用于执行method代表的方法
//obj表示执行哪个对象的方法,args是执行方法时需要传入的参数
Object obj = clazz.newInstance();
//如果是私有方法,则需在invoke之前加一句method.setAccessible(true);
method.invoke(obj,2);

目前本人只学懂了这些,如需更加深入学习,请参考https://www.cnblogs.com/tech-bird/p/3525336.html

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值