黑马程序员技术交流社区

标题: 为什么java有反射机制,反射机制的原理是什么呢 [打印本页]

作者: 陈波    时间: 2012-5-19 21:36
标题: 为什么java有反射机制,反射机制的原理是什么呢
为什么java有反射机制,反射机制的原理是什么呢
作者: 李保成    时间: 2012-5-19 21:43
反射:
  可以动态的获取指定类中的成员,以及建立类对象。
好处:提高了程序的扩展性。
  当class文件产生以后,这些class文件也是生活中的事物,那么对这些class文件也可以进行描述,该描述对应的类型就是Class.
  在java中,每一个字节码文件都有一一个与之对应的Class对象。不仅包括引用数据类型,也包括基本数据类型。int.Class
作者: 李保成    时间: 2012-5-19 21:48

反射的常用类和函数:Java反射机制的实现要借助于4个类:Class,Constructor,Field,Method;其中class代表的是类对象,Constructor-类的构造器对象,Field-类的属性对象,Method-类的方法对象,通过这四个对象我们可以粗略的看到一个类的各个组成部分。其中最核心的就是Class类,它是实现反射的基础,它包含的方法我们在第一部分已经进行了基本的阐述。应用反射时我们最关心的一般是一个类的构造器、属性和方法,下面我们主要介绍Class类中针对这三个元素的方法:

1、得到构造器的方法

Constructor getConstructor(Class[] params) -- 获得使用特殊的参数类型的公共构造函数,

Constructor[] getConstructors() -- 获得类的所有公共构造函数

Constructor getDeclaredConstructor(Class[] params) -- 获得使用特定参数类型的构造函数(与接入级别无关)

Constructor[] getDeclaredConstructors() -- 获得类的所有构造函数(与接入级别无关)

2、获得字段信息的方法

Field getField(String name) -- 获得命名的公共字段

Field[] getFields() -- 获得类的所有公共字段

Field getDeclaredField(String name) -- 获得类声明的命名的字段

Field[] getDeclaredFields() -- 获得类声明的所有字段
3、获得方法信息的方法

Method getMethod(String name, Class[] params) -- 使用特定的参数类型,获得命名的公共方法

Method[] getMethods() -- 获得类的所有公共方法

Method getDeclaredMethod(String name, Class[] params) -- 使用特写的参数类型,获得类声明的命名的方法

Method[] getDeclaredMethods() -- 获得类声明的所有方法

应用反射的基本步骤:

1、获得你想操作的类的Class对象;

     方法一:Class c=Class.forName("java.lang.String")

     方法二:对于基本数据类型可以用形如Class c=int.class或Class c=Integer.TYPE的语句

     方法三:Class c=MyClass.class

2、调用Class中的方法得到你想得到的信息集合,如调用getDeclaredFields()方法得到类的所有属性;

  3、处理第2步中得到的信息,然后进行你想做的实际操作。

  反射实例:

下面我将针对类的构造器、属性和方法分别举三个例子,向大家演示一下反射的应用过程。

1、构造器

步骤为:通过反射机制得到某个类的构造器,然后调用该构造器创建该类的一个实例

import java.lang.reflect.*;
public class ConstructorDemo{
   public ConstructorDemo(){ }
   public ConstructorDemo(int a, int b){
       System.out.println("a="+a+"b="+b);
   }

   public static void main(String args[]){
       try {
           Class cls = Class.forName("ConstructorDemo");
           Class partypes[] = new Class[2]; partypes[0] = Integer.TYPE;   
           partypes[1] = Integer.TYPE;
           Constructor ct= cls.getConstructor(partypes);
           Object arglist[] = new Object[2];
           arglist[0] = new Integer(37);
           arglist[1] = new Integer(47);
           Object retobj = ct.newInstance(arglist);
         } catch (Throwable e) {
           System.err.println(e); }
         }
   }

2、属性

步骤为:通过反射机制得到某个类的某个属性,然后改变对应于这个类的某个实例的该属性值

import java.lang.reflect.*;
public class FieldDemo1{
  public double d;

  public static void main(String args[]){
  try {
    Class cls = Class.forName("FieldDemo1");
    Field fld = cls.getField("d");
    FieldDemo1 fobj = new FieldDemo1();
    System.out.println("d = " + fobj.d);
    fld.setDouble(fobj, 12.34);
    System.out.println("d = " + fobj.d);
  } catch (Throwable e){
    System.err.println(e); }
  }
}

3、方法

步骤为:通过反射机制得到某个类的某个方法,然后调用对应于这个类的某个实例的该方法

//通过使用方法的名字调用方法
import java.lang.reflect.*;
public class MethodDemo1{
  public int add(int a, int b){
  return a + b;
  }

  public static void main(String args[]){
    try {
      Class cls = Class.forName("MethodDemo1");
      Class partypes[] = new Class[2];
      partypes[0] = Integer.TYPE;
      partypes[1] = Integer.TYPE;
      Method meth = cls.getMethod("add", partypes);
      MethodDemo1 methobj = new MethodDemo1();
      Object arglist[] = new Object[2];
      arglist[0] = new Integer(37);
      arglist[1] = new Integer(47);
      Object retobj= meth.invoke(methobj, arglist);
      Integer retval = (Integer)retobj;
      System.out.println(retval.intValue());
    } catch (Throwable e) {
      System.err.println(e);
    }
  }
}

作者: 余宏    时间: 2012-5-19 21:51
1,我们有反射机制
在运行时判断任意一个对象所属的类;在运行时构造任意一个类的对象;在运行时判断任意一个类所具有的成员变量和方法;在运行时调用任意一个对象的方法;生成动态代理。
2.原理:
在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性
作者: 于潇    时间: 2012-5-19 21:53
在程序开发中使用反射并结合属性文件,可以达到程序代码与配置文件相分离的目的
如果我们想要得到对象的信息,一般需要“引入需要的‘包.类’的名称——通过new实例化——取得实例化对象”这样的过程。使用反射就可以变成“实例化对象——getClass()方法——得到完整的‘包.类’名称”这样的过程。
正常方法是通过一个类创建对象,反射方法就是通过一个对象找到一个类的信息。
作者: 8161776    时间: 2012-5-19 21:55
反射机制:所谓的反射机制就是java语言在运行时拥有一项自观的能力。通过这种能力可以彻底的了解自身的情况为下一步的动作做准备。下面具体介绍一下java的反射机制。这里你将颠覆原来对java的理解。
Java的反射机制的实现要借助于4个类:class,Constructor,Field,Method;其中class代表的时类对 象,Constructor-类的构造器对象,Field-类的属性对象,Method-类的方法对象。通过这四个对象我们可以粗略的看到一个类的各个组 成部分。




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2