Java反射

来源:互联网 发布:随意裁剪图片软件 编辑:程序博客网 时间:2024/06/05 22:29

在Java中一切皆对象,但是基本数据类型(int ,char,double,folat,baty),静态成员属于类。其实类也是对象,他是java.lang.Class类的实例对象。JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。

1.Class类是对象,是Java.lang.Class类的实例对象,但是不能通过new关键字获取(他的构造函数私有);但是有三种获取方式:

1.Class c1=类名.Class 实际上每一个类都有一个隐含的静态成员变量class;

2.已知该类的对象,通过getClass方法

Class c2=对象名.getClass();

3.Class c3=Class.forName(“类所在的位置”);

2.Java中类的动态加载:

Class.forName(“类所在位置”),不仅表示了类的类型,还代表动态加载类。在此说明编译时刻是静态加载,运行时刻加载类是动态加载类。new对象是静态加载类的,在编译时刻就需要加载所有可能用到的类。而有些情况需要我们进行动态加载如:

class c1=Class.forName(args[0]);//根据输入的内容加载类

3.获取类的所有信息:

方法:

Class c=obj.getClass();//获取Class 类

String name=c.getName();//获取类的名称

//获取类的所有方法,获取的是public,同时也包括父类继承而来的

Method []ms=c.getMethods();

//获取本类中的方法

Mothod []ms=c.getDeclaredMethods();

//方法返回值类型

ms[i].getReturnType();

//方法名称

ms[i].getName();

    //获取方法参数 :

Class [] paraType=ms[i].getParamTypes();

成员变量:

Field类封装了关于成员变量的操作

//getFileds()方法获取所有public的成员变量信息。

Filed [] fs=c.getFileds();

//获取本类中成员变量

Filed [] fs=c.getDeclaredFileds()

构造函数:

Constructor [] con=c.getConstructors();

Constructor [] con =c.getDeclaredConstructors();

4.方法的反射:

1.如何获取某个方法:方法的名称和方法的参数列表唯一决定

2.方法的反射的操作: method.invoke(对象,参数列表);

另外说明泛型,集合发的泛型是防止错误输入的,在 编译之后是去泛型化得,Java中集合的泛型只是在编译的阶段有效,绕过编译就无效了,可以通过方法的反射来操作绕过编译。

0 0