[原创]JAVA反射技术(二)

原创 2004年09月11日 10:33:00

Lesson:2 处理对象
1.Creating Objects
一般情况下,创建一个对象用以下方法
Rectangle r = new Rectangle();
但如果你正在开发一个development tools,在运行之前或许不知道要生成对象的类。
所以要像下面这样来创建对象:
String className;

// . . . load className from the user interface

Object o = new (className); // WRONG!


但以上是错误的。
正确的方法是使用类的反射特性:


1)Using No-Argument Constructors
例如:
    Class classDefinition = Class.forName(className);//指定类的运行期实例
    object = classDefinition.newInstance();//调用无参构造函数来生成指定类的实例。

2)Using Constructors that Have Arguments
这个技术要用到如下步骤:
a,创建一个Class对象
b,创建一个Constructor对象,getConstructor(Class[] params)方法,参数是一个与构造方法相适合的Class 数组.
c,在Constructor对象上调用newInstance方法来生成一个对象,参数 是一个object数组与这个构造方法相配备。

例如:
import java.lang.reflect.*;
import java.awt.*;

class SampleInstance {

   public static void main(String[] args) {

      Rectangle rectangle;
      Class rectangleDefinition;
     

Class[] intArgsClass = new Class[] {int.class, int.class};
      Integer height = new Integer(12);
      Integer width = new Integer(34);
      Object[] intArgs = new Object[] {height, width};

      Constructor intArgsConstructor;

      try {
//1.
        rectangleDefinition = Class.forName("java.awt.Rectangle");
  //2.
      intArgsConstructor =
            rectangleDefinition.getConstructor(intArgsClass);//找到指定的构造方法
//3.     
  rectangle =
            (Rectangle) createObject(intArgsConstructor, intArgs);//构造方法描述对象,object[]
      } catch (ClassNotFoundException e) {
          System.out.println(e);
      } catch (NoSuchMethodException e) {
          System.out.println(e);
      }
   }

   public static Object createObject(Constructor constructor,
                                     Object[] arguments) {

      System.out.println ("Constructor: " + constructor.toString());
      Object object = null;

      try {
        object = constructor.newInstance(arguments);
        System.out.println ("Object: " + object.toString());
        return object;
      } catch (InstantiationException e) {
          System.out.println(e);
      } catch (IllegalAccessException e) {
          System.out.println(e);
      } catch (IllegalArgumentException e) {
          System.out.println(e);
      } catch (InvocationTargetException e) {
          System.out.println(e);
      }
      return object;
   }
}

 

2。Getting Field Values
If you are writing a development tool such as a debugger, you must be able to obtain field values. This is a three-step process:
如果要作一个开发工具像debugger之类的,你必须能发现filed values,以下是三个步骤:
a.创建一个Class对象
b.通过getField 创建一个Field对象
c.调用Field.getXXX(Object)方法(XXX是Int,Float等,如果是对象就省略;Object是指实
例).

例如:
import java.lang.reflect.*;
import java.awt.*;

class SampleGet {

   public static void main(String[] args) {
      Rectangle r = new Rectangle(100, 325);
      printHeight(r);

   }

   static void printHeight(Rectangle r) {
      Field heightField;
      Integer heightValue;
      Class c = r.getClass();
      try {
        heightField = c.getField("height");
        heightValue = (Integer) heightField.get(r);
        System.out.println("Height: " + heightValue.toString());
      } catch (NoSuchFieldException e) {
          System.out.println(e);
      } catch (SecurityException e) {
          System.out.println(e);
      } catch (IllegalAccessException e) {
          System.out.println(e);
      }
   }
}

3。Setting Field Values
a.创建一个Class对象
b.通过getField 创建一个Field对象
c.调用Field.set(Object,withparam)方法(XXX是Int,Float等,如果是对象就省略;Object是指实例,withparam指和这个字段相区配的字段。

import java.lang.reflect.*;
import java.awt.*;

class SampleSet {

   public static void main(String[] args) {
      Rectangle r = new Rectangle(100, 20);
      System.out.println("original: " + r.toString());
      modifyWidth(r, new Integer(300));
      System.out.println("modified: " + r.toString());
   }

   static void modifyWidth(Rectangle r, Integer widthParam ) {
      Field widthField;
      Integer widthValue;
      Class c = r.getClass();
      try {
        widthField = c.getField("width");
        widthField.set(r, widthParam);
      } catch (NoSuchFieldException e) {
          System.out.println(e);
      } catch (IllegalAccessException e) {
          System.out.println(e);
      }
   }
}

4。调用指定的方法
a.创建一个Class对象
b.创建一个方法对象method,getMethod(String methodName,Class[])方法
c.调方法对象,method.invoke(object,Object[]),两个参数,第一个是指调用方法所属于的对象,第二个是传递的值对象列表。

The sample program that follows shows you how to invoke a method dynamically. The program retrieves the Method object for the String.concat method and then uses invoke to concatenate two String objects.
//


import java.lang.reflect.*;

class SampleInvoke {

   public static void main(String[] args) {
      String firstWord = "Hello "; //指定类的实例

      String secondWord = "everybody.";//变元


      String bothWords = append(firstWord, secondWord);
      System.out.println(bothWords);
   }

   public static String append(String firstWord, String secondWord) {
      String result = null;
      Class c = String.class;
      Class[] parameterTypes = new Class[] {String.class};
      Method concatMethod;
      Object[] arguments = new Object[] {secondWord};
      try {
        concatMethod = c.getMethod("concat", parameterTypes);//获取到方法对象
        result = (String) concatMethod.invoke(firstWord, arguments);//调用
      } catch (NoSuchMethodException e) {
          System.out.println(e);
      } catch (IllegalAccessException e) {
          System.out.println(e);
      } catch (InvocationTargetException e) {
          System.out.println(e);
      }
      return result;
   }
}


 

Java反射机制详解

第一次听说java反射机制的时候,觉得很高大上,毕竟从名字上了就可以知道它的专业性,事实上java反射也确实很牛逼,当我开始正真学习它的时候,我的整个学习过程中整个人也是懵逼的,但是呢!这也更激起了我...
  • weixian52034
  • weixian52034
  • 2016年08月10日 12:23
  • 1118

深入理解java反射机制

一,java的核心机制java有两种核心机制:java虚拟机(JavaVirtual Machine)与垃圾收集机制(Garbage collection): Java虚拟机:是运行所有Java...
  • u012585964
  • u012585964
  • 2016年07月24日 02:32
  • 6547

Java 编程的动态性,第 8 部分: 用代码生成取代反射

既然您已经看到了如何使用 Javassist 和 BCEL 框架来进行 classworking (请参阅 本系列以前的一组文章), 我将展示一个实际的 classworking 应用程序。这个应...
  • yczz
  • yczz
  • 2013年11月07日 22:52
  • 1711

JAVA中的反射机制

反射,当时经常听他们说,自己也看过一些资料,也可能在设计模式中使用过,但是感觉对它没有一个较深入的了解,这次重新学习了一下,感觉还行吧!            一,先看一下反射的概念:      ...
  • liujiahan629629
  • liujiahan629629
  • 2014年01月08日 22:31
  • 370278

java中的反射技术

1: java中的反射机制:  a)在Java 运行时 环境中,对任意一个类, 可以知道这个类所有的属性和方法。 b)任意一个对象,可以动态地获取类的信息,然后调用类中的方法, 也是基于jav...
  • wanghang88
  • wanghang88
  • 2016年10月30日 17:50
  • 262

java反射技术

反射是什么,用最简单的语句来介绍反射就是加载类并解剖类的各个组成部分,稍有java基础的人都知道,java类在内存中是以字节码的形式存在的,而java中有一个Class类表示的正是某个类的字节码对象。...
  • Angus_lee
  • Angus_lee
  • 2013年08月09日 11:48
  • 606

(Java基础--反射)框架的概念及用反射技术开发框架的原理

框架的概念及用反射技术开发框架的原理 一、概述 1、框架:通过反射调用Java类的一种方式。         (框架与房子非常类似,使用的用户写的程序写配置文件,就相当于给房子装修)   ...
  • ZuoAnYinXiang
  • ZuoAnYinXiang
  • 2016年01月10日 21:06
  • 1387

Java反射机制与应用

JAVA反射机制     JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法;这种动态获取的信息以及动态调用对象的方法的功能...
  • xiaoxian8023
  • xiaoxian8023
  • 2013年06月30日 20:45
  • 9324

Java反射通过配置文件来运行想要运行的方法

程序通过配置文件运行,用户配置什么,运行什么, 重要部分  实现步骤:     A 准备配置文件 集合类 Properties做     B 使用IO流技术,关联集合类,读取配置文件     C 通过...
  • m75100313
  • m75100313
  • 2014年01月06日 23:37
  • 1488

Java中的反射机制和动态性以及javaBean的自省技术

Java中的反射机制和动态性 反射机制: 在java中,在运行过程中去调用一个编译时完全不知道的类的属性和方法,这种动态的调用方式叫做反射机制。(自己写的)   重点: 获取对象的属性和方法...
  • qajfsadhjk
  • qajfsadhjk
  • 2014年05月12日 22:00
  • 980
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:[原创]JAVA反射技术(二)
举报原因:
原因补充:

(最多只允许输入30个字)