Java反射

个人网站:https://tinuv.me
更好的阅读体验https://tinuv.me/2018/07/22/197.html

介绍

Java的反射机制我学习Java以来一直很忽视,一直到我最近学习Spring框架和各种注解框架了解到幕后的反射机制是背后的功臣,才下定决心要好好的学一学.Java反射机制是在运行状态中,对于任意一个类,都能获得这个类的所有属性和方法,对于任何一个对象都能调用它的任意一个属性和方法.要使用Java的反射机制主要使用的是Class类java.lang.reflect包

获得Class对象

要获得类或对象的属性和方法必须要获得一个class对象.获得class对象的方法有三种.

通过Object.getClass()方法获得class对象

object类是所有类的基类,这个类有一个getClass()方法,这个方法是公共方法,因此是获取对象的属性和方法,就是说类必须实例化成对象才能调用.

MovieEntity movieEntity = new MovieEntity();
Class<MovieEntity> movieEntityClass = (Class<MovieEntity>) movieEntity.getClass();
System.out.println(movieEntityClass.getName());

Class里面的泛型也可以这样写,表示任意类型,Class里面的泛型要求是子类就可以,比如上面的例子,要求是MovieEntity的子类

Class<?> movieEntityClass = movieEntity.getClass();

通过object的静态字段获得class对象

这个是获得类的属性和方法,无需将类实例化

Class<?> movieEntityClass = MovieEntity.class;

通过Class.forName()获得class对象

这个方法也是静态方法,要注意的可以不用将完整的包名传入.

Class<?> movieEntityClass = Class.forName("MovieEntity");
Class<?> muiscClass = Class.forName("test.Music");

获得对象或类的属性和方法

获得构造方法并实例化

Class<?> movieEntityClass = Class.forName("MovieEntity");
Constructor<MovieEntity> movieEntityConstructor = (Constructor<MovieEntity>) movieEntityClass.getConstructor();
MovieEntity movieEntity = movieEntityConstructor.newInstance();

这里面捕获的异常是很多的,这里获取了一个无参的构造方法,也可以获取有参的构造方法

获得里面的属性(字段)

获得公共属性

Class<?> movieEntityClass = Class.forName("MovieEntity");
String title = movieEntityClass.getField("rate");
//Field field = movieEntityClass.getField("rate");也可以将Filed转化类型
获得私有属性
Class<?> movieEntityClass = Class.forName("MovieEntity");
Field field = movieEntityClass.getDeclaredField("title");
field.setAccessible(true); //设置有权限访问

获得类或对象的方法并运行

获得私有方法并运行
Class<?> movieEntityClass = Class.forName("MovieEntity");
Constructor<MovieEntity> movieEntityConstructor = (Constructor<MovieEntity>) movieEntityClass.getConstructor();
MovieEntity movieEntity = movieEntityConstructor.newInstance();
Method showMessage = movieEntityClass.getDeclaredMethod("showMessage",null);
showMessage.setAccessible(true);
showMessage.invoke(movieEntity,null);
获得公共方法并运行
Class<?> movieEntityClass = Class.forName("MovieEntity");
Constructor<MovieEntity> movieEntityConstructor = (Constructor<MovieEntity>) movieEntityClass.getConstructor();
MovieEntity movieEntity = movieEntityConstructor.newInstance();
Method method = movieEntityClass.getMethod("setId", int.class);
method.invoke(movieEntity,10);
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值