JAVA反射机制

来源:互联网 发布:手机端js关闭当前页面 编辑:程序博客网 时间:2024/06/05 11:41

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("属性名"));}
原创粉丝点击