类反射

反射

主要是通过类加载,动态的访问,检测和修改类本身状态或行为的一种能力,并能根据自身行为的状态和结果,调整或修改应用所描述行为的状态和相关语义。

正常方式:
引入需要的"包.类" --> new实例化 --> 取得实例化对象
反射方式:
获取目标的Class对象 --> 得到类的完整信息 --> 取得实例化对象

反射的常用类
Class:Constructor、Field、Method…
接下来就用代码的形式演示反射的用法

public class Demo(){
	public String name;
	private int age;
	public Date birthday;
	public Demo(String name, int age, Date birthday) {
		this.name = name;
		this.age = age;
		this.birthday = birthday;
	}
	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;
	}
	public Date getBirthday() {
		return birthday;
	}
	public void setBirthday(Date birthday) {
		this.birthday = birthday;
	}
}
//获取目标实例三种方法
//1、只进行类加载,不进行初始化,对只获取类信息很好用
Class<Demo> cl1=Demo26.class;
//2、对目标进行类加载,进行静态初始化
Class cl2=Class.forName("com.类全名.Demo");
//3、对类进行加载,进行初始化
Class cl3=new Demo().getClass();

//获取类修饰符,getModifiers返回的是int类型,Modifier.toString将其写为访问修饰符
Modifier.toString(cl1.getModifiers());
//cl1.getName()、cl1.getSimpleName()分别访问类全名和类名
//supCl是血缘最近的父类,他也是一个Class,所以拥有同样的一些操作
Class superCl=cl1.getSuperclass();
//getInterfaces()获得这个class实现的多有接口名,用数组存储
//而接口同样是类,也可以实现Class的操作
Class[] InterCl=cl1.getInterfaces();

//获取构造器
Constructor<Demo> con=cl1.getDeclaredConstructor(String.class,int.class,Date.class);
//获取构造器修饰符
Modifier.toString(con.getModifiers());
//获取本类所有构造器
Constructor[] cons=cl1.getDeclaredConstructors();
//利用构造器创建目标类对象new Demo()
Demo demo = con.newInstance("Jack",19,new Date());

//Filed类
//获取目标属性
Field field1=cl1.getDeclaredFiled("age");
//获取属性修饰
Modifier.toString(field1.getModifiers());
//获取属性类型
field1.getType().getSimpleName();
//获取属性名称
field1.getName();
//突破访问权限private,这里age设置的private,具体到某个实例中,如:
Demo demo=cl1.newInstance();//实例
field1.setAccessible(true);//突破权限设置
field1.set(demo,2);//设置某实例的该属性
field1.get(demo);//获得属性值
Field[] fields=cl1.getFields();
//此处返回本类及所有祖先的public属性的数组集
//如果是getDeclaredFields则返回本类的所有属性的数组集

//Method类
Method[] methods=cl1.getMethods();
//此处返回本类及所有祖先的public方法的数组集
//如果是getDeclaredMethods则返回本类的所有方法的数组集
//获取目标方法
Method setAgeMethod=cl1.getDeclaredMethod("setAge", int.class);
//获取方法修饰
Modifier.toString(setAgeMethod.getModifiers());
//获取返回类型
setAgeMethod.getReturnType().getSimpleName();
//获取方法名
setAgeMethod.getName();
//获取所有抛出的异常
Class[] excep=setAgeMethod.getExceptionTypes();

//使用方法
Object obj = setAgeMethod.invoke(demo,12);
Method getAgeMethod=cl1.getDeclaredMethod("getAge");
Object obj = getAgeMethod.invoke(demo);
System.out.println(obj);

以上就是类反射的用法,涉及到的有Class、Constructor、Field、Method类,其中后三者的用法很多都是差不多的,例如Modifier.toString(E.getModifiers())去获取访问修饰符,getDeclaredDemos()、getDemos()(Demo是具体的类)去获取该类的数组集合。其他就需要去多熟练使用,这是作为充分掌握并利用java的重要知识点。

落笔于2019/4/26 17:22

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值