反射入门

来源:互联网 发布:网站美工教程 编辑:程序博客网 时间:2024/04/29 18:04

常见的反射类

JAVA中获取Class对象有3种方式:
1.Class.forName()
2.Object.getClass()
3.类字面常量 xx.class

 

获取类的构造器 
首先介绍一下Constructor类,这个类用来封装反射得到的构造器,Class有四个方法来获得Constructor对象
public Constructor<?>[] getConstructors() 返回类中所有的public构造器集合,默认构造器的下标为0
public Constructor<T> getConstructor(Class<?>... parameterTypes) 返回指定public构造器,参数为构造器参数类型集合
public Constructor<?>[] getDeclaredConstructors() 返回类中所有的构造器,包括私有
public Constructor<T> getDeclaredConstructor(Class<?>...parameterTypes) 返回任意指定的构造器

获取类的成员变量 
成员变量用Field类进行封装,主要的方法非常的类似:
public Field getDeclaredField(String name) 获取任意指定名字的成员
public Field[] getDeclaredFields() 获取所有的成员变量
public Field getField(String name) 获取任意public成员变量
public Field[] getFields() 获取所有的public成员变量

获取类的方法 
public Method[] getMethods() 获取所有的共有方法的集合
public Method getMethod(String name,Class<?>... parameterTypes) 获取指定公有方法 参数1:方法名 参数2:参数类型集合 
public Method[] getDeclaredMethods() 获取所有的方法
public Method getDeclaredMethod(String name,Class<?>... parameterTypes) 获取任意指定方法

 

一通过反射机制得到类的包名和类名

son son= new son();//打印包名

         System.out.println(son.getClass().getPackage().getName());

         //打印类名

         System.out.println(son.getClass().getName());

结果:

Testreflection

Testreflection.son

二无参构造函数创建实例

Class<?> class1=null;

        class1=Class.forName("Testreflection.son");

        fatherfather=(father)class1.newInstance();

        father.setName("小明");

        System.out.print(father.getName());

结果:

小明

三有参构造函数创建实例

//获得所有构造函数

        Constructor[]constructors=son.getClass().getConstructors();

        for(int i=0;i<constructors.length;i++){

            System.out.println(constructors[i].getName());

        }

//结果

Testreflection.son

Testreflection.son

//获得一个参数的构造函数

//一个参数的构造函数

        Constructorconstructors1=son.getClass().getConstructor(String.class);

//结果

我是一个参数的构造函数

//两个参数的构造函数

        Constructorconstructor2=son.getClass().getConstructor(String.class,String.class);

 

四修改字段信息

    //获得所有的字段信息私有的和非私有的

        Field[] string= son.getClass().getDeclaredFields();

        //获得私有的字段名称

        Fieldname= son.getClass().getDeclaredField("name");

        //获得公有的字段名称

        Fieldsex=son.getClass().getField("sex");

        System.out.print(name.toString());

        System.out.print(sex.toString());

        //name只是字段的名称不包含字段里的值,想修改其内容如下做

        name.setAccessible(true); //私有字段允许修改

        Objectobj=son.getClass().newInstance();

        name.set(obj,"梨花");

        //修改之后的值

        System.out.print(name.get(obj));

五通过反射调用类方法

son son= new son();

       

        //调用无参方法

        Methodrun=son.getClass().getMethod("run");

        //调用有参方法

        Methodsleep=son.getClass().getMethod("sleep", String.class);

        //静态方法

        Methodread=son.getClass().getMethod("read");

       

        run.invoke(son.getClass().newInstance());

       

        sleep.invoke(son.getClass().newInstance(),"");

   

        read.invoke(null);

        MethodintHandle=son.getClass().getMethod("intHandle",int[].class);

        MethodstringHandle=son.getClass().getMethod("stringHandle", String[].class);

        //普通的int类型一唯数组不能转换为object数组

        intHandle.invoke(son.getClass().newInstance(),(Object) newint[]{1,2,3});

        //string类型数组可以转换成为object类型的数组

        stringHandle.invoke(son.getClass().newInstance(),newObject[]{newString[]{"2","4","5"}});

0 0
原创粉丝点击