当前位置: 首页 > 图文教程 > 网络编程 > JSP > JAVA反射技术(二)

JSP
客户端界面中可视化的实现树形框架的设计
Win2000下JBoss开发环境配置
调试处理系统核心文件
Matrix java 大讲坛 之 可用性与人机界面
JMX调试----第三方工具使访问更加容易
用BSF如何在Java中嵌入javascript以及如何在javascript中
再次提醒\" 请不要做浮躁的人\"
从Coding Fan到真正的技术专家(cjsdn)
数据库BEAN:RESIN连接池
基于Java的Web服务器工作原理(一)
XDE中模式驱动的设计与开发(三)
页面流(Page flow)表单验证
高级页面流(Page flow):嵌套、异常处理和 Global.app
请不要做浮躁的人(ZT-必读)
解决日期选择问题,一劳永逸(使用Decorator模式实现日期选择组件)(二)
解决日期选择问题,一劳永逸(使用Decorator模式实现日期选择组件)(三)
解决日期选择问题,一劳永逸(使用Decorator模式实现日期选择组件)(四)
解决日期选择问题,一劳永逸(使用Decorator模式实现日期选择组件)(五)
EJB技术之旅(一)
MVC渐行渐进(二)

JSP 中的 JAVA反射技术(二)


出处:互联网   整理: 软晨网(RuanChen.com)   发布: 2009-09-04   浏览: 351 ::
收藏到网摘: n/a

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;
}
}