JAVA反射机制
Java反射机制是Java被视为动态(或准动态)语言的一个关键性质,这个机制允许程序在运行状态中,透过Refection APIs,获取任意一个对象的内部信息:
- modifiers
修饰词
如:public、static等
- superclass 如:
Object
- interface
接口
的实现类 如:Cloneable
- fields
属性
- mothod
方法
java反射机制可以在程序运行时:改变field
、调用method
、加载、探知、使用编译期间完全未知的classes
。
动态 获取信息
以及调用对象
的方法的功能称为 Java语言的反射机制。
总结一下:
反射就是通过名字反向获取类对象,属性,方法;
应用场景:
在事先不确定new 哪个对象,给哪个属性赋值,调哪个方法如果确定不要使用反射
反射机制提供的功能
在运行时判断任意一个对象所属的类
在运行时构造任意一个类的对象
在运行时判段任意一个类所具有的成员变量和方法
在运行时调用任一个对象的方法
在运行时创建新类对象:通过类对象可以反向new对象 类对象.newInstance();
通过类对象可以获取类的所有信息(属性和方法);
类是对象的模版,也就是可以通过类对象获取对象的所有信息(信息不是属性值);
注意: Class对象(类对象)
使用Java的反射功能时,基本首先都要获取类的Class对象,再通过Class对象获取其他的对象。
类对象:
.class
文件会被JVM
加载为Class对象(类对象)
Class也是一个类,是类对象的类型(类是对象的类型)
Class在java.lang包中,无需导包
一个.class文件对应一个类对象,所有类对象的类型都是Class
获取类对象
方法1:
Class<?> cls = Class.forName("类名");
注意:
类名:必须是全限定名:包名.类名
Class.forName:通过类名反向获取类对象
类名必须是JVM加载完毕后的,所以要进行异常处理
Class.forName("类名")如果不接收返回值,只是加载该.class文件到JVM中
方法2:
Class<X> cls = X.class;(X是一个类); //类.class获取类对象
Class<Master> clsMaster = Master.class;
getDeclaredXXX和getXXX的区别:
带Declared是获取本类中声明的方法或属性,包括private
不带Declared是获取所有public的属性和方法,包括父类public的
getDeclaredMethod()、getMethod()
无参:(方法名)
有参:(方法名,参数类型...):Class.getMethod("setStrain",String.class)
调用:从里到外对象调用Method;
Method.invoke(对象名,参数值...);
注意: 如果调用方法有返回值,就用Object类型的引用接收返回结果;
调用父类中的private属性、方法:
Class<X> cls = X.class;
X x = null;
Class<?> superClass = cls.getSuperclass(); //获取X的父类
try{
if(superClass == Object.class){
System.out.out("该类没有父类");
}
Field superField = superClass.getDeclaredField("属性名");
superField.setAccessible(true);
superField.set(x, rs.getObject("属性名")); //rs.getObject() 获取对应属性名的值
} catch(NoSuchFieldEcxeption e) {
Field childField = X.getDeclaredField("属性名");
childField.setAccessible(true);
childField.set(x, rs.getObject("属性名"));
}