反射

Posted on 2013-03-21 00:39  我是王琦  阅读(207)  评论(0)    收藏  举报

 

 

反射:

反射就是把java类中的各种成分映射到成相应的java类

 一个类的组成部分是:成员变量,方法,构造方法,包等等信息,这些信息都可以用类来表示。

表示java类的Class类提供了一些方法来获取其中的变量,方法,构造方法,修饰符,包等信息,

这些信息同时也是相应的类,Field表示成员,Method 表示方法,Contructor表示构造方法,Package表示包等等。

获取到类中成员的类后,可以可以用相应成员类的方法来调用相应的成员变量,方法或构造函数等等。

Class类

Class类表示类的字节码文件,每一个类都有对应的字节码文件,

获取类的字节码文件方法

Class 类名.class

Class 对象.geClass() 

Class forName("类名");

反射构造方法

Constructor类表示ava中的构造方法的类

在Class类中有一个getConstructor()方法,获取构造方法

因为每一个类都有对应的Class类,所以可通过此方法获取构造方法,当类中存在多个构造方法时,就需要指定构造参数列表,这里的参数列表指的是参数类型的字节码。

获取发哦构造方法之后,可以通过newInstance(参数列表)方法创建实例对象。注意:这里返回值是Object 需要强制转换成对应类型。

例如:

class Student

{

  private String name;

  private int age;

  Student(){};

  Student(String name,int age){

  this.name=name;

  this.age=age;

  }

  Student(String name){}

  public String toString()

  {

    return name+"::"+age;

  }

}

class Demo

{

  public static void main(String[] args)

  {

    //在这里获取Student类的构造方法

    //首先获取Student的字节码

    Class clazz=Student.class;

    Constructor constructor=clazz.getConstructor();//获取空参数的构造方法

    Student stu1=(Student)constructor.newInstance();//创建对象

    Constructor constructor2=clazz.getConstructor(String.class,int.class)//获取参数类型为String,int的构造方法。

    Student stu1=(Student)constructor.newInstance("wangqi",34);//创建对象,强制转换类型

    Constructor constructor3=clazz.getConstructor(String.name)//获取参数类型为String的构造方法

    Student stu1=(Student)constructor.newInstance("asdf");//创建对象强制转换类型

     }

}

反射成员

Field表示类中成员的类,Class中有一个getField的方法获取成员变量

同样首先要获取到相应类的字节码文件对象,因为它是代表某个类上的变量。

获取到对象的子节码后调用getField()返回一个成员变量,getFields()返回一个Field[]数组

反射非私有化变量时,可使用上面的方法,

当反射私有成员时利用上面的方法机会报错,需要用到getDeclaresField()获取Field,当药用到Field时需要设置,setAccessible(true);(称为暴力反射)

结合上面的例子,反射出Student的成员变量

 Student stu=(Student)Student.getConstructor(String.class,int.class).newInstance("wq",22);

Field[] fields=stu.getClass().getFields();

for(Field field:fields)//遍历该类所有成员变量

{

  System.out.println(field.get(stu));//打印结果为wq,22;

}

方法的反射

Method表示类中的方法

反射方法,首先要获取类的字节码文件对象。通过getMethod(String name Class primiteType)方法,返回Method对象啊。

获取懂Method对象后,调用invoke(参数列表)方法调用该方法。

注意:getMethod(参数列表),该方法的参数列表是传递的方法名,和方法参数的类型的字节码

调用方法时用invoke(参数列表)此参数列表指定的是调用此方法的对象,和实际参数。

还是上面的例子:

反射toString方法

Method method=s.getClass().getMethod("toString", null);获取方法,传递方法名和参数类型

String str=method.invoke(s,null)//调用方法传递对象,和方法
  System.out.println(str);//打印结果为wangqi::22

 

博客园  ©  2004-2025
浙公网安备 33010602011771号 浙ICP备2021040463号-3