`
hanqunfeng
  • 浏览: 1529624 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

java反射介绍

    博客分类:
  • JAVA
阅读更多

一。课程:检查类

1.获得Class对象

得到Class对象

Class c = mystery.getClass();

得到超类的Class对象

TextField t = new TextField();

Class c = t.getClass();

Class s = c.getSuperclass();

通过类名获得Class对象

String strg="java.awt.Button";

Class c = Class.forName(strg);

2.获得类名

获得全路径名

Button b = new Button();

Class c = b.getClass();

String s = c.getName(); //java.awt.Button

3.发现类修饰符

定义一个类需要以下的修饰符:publicabstract,或者final

1). 调用Class对象的getModifiers方法麳返回修饰符的集合。

2). 通过调用isPublicisAbstractisFinal方法麳检查修饰符。

例子

import java.lang.reflect.*;

import java.awt.*;

class SampleModifier {

public static void main(String[] args) {

String s = new String();

printModifiers(s);

}

public static void printModifiers(Object o) {

Class c = o.getClass();

int m = c.getModifiers();//m17161的合public1final16

if (Modifier.isPublic(m))

System.out.println("public");

if (Modifier.isAbstract(m))

System.out.println("abstract");

if (Modifier.isFinal(m))

System.out.println("final");

}

}

示例程序的输出

public

final

4.寻找超类

可以调用getSuperclass方法。这个方法返回超类的Class对象或者返回null如果这个类没有超类。为了指定所有的父类,可以迭代调用getSuperclass直到返回null为止。

以下这个程序查找Button类的父类的名字。

import java.lang.reflect.*;

import java.awt.*;

class SampleSuper {

public static void main(String[] args) {

Button b = new Button();

printSuperclasses(b);

}

static void printSuperclasses(Object o) {

Class subclass = o.getClass();

Class superclass = subclass.getSuperclass();

while (superclass != null) {

String className = superclass.getName();

System.out.println(className);

subclass = superclass;

superclass = subclass.getSuperclass();

}

}

}

示例程序的输出为

java.awt.Component

java.lang.Object

5.指定被类实现的接口

以下程序打印RandomAccessFile实现的接口。

import java.lang.reflect.*;

import java.io.*;

class SampleInterface {

public static void main(String[] args) {

try {

RandomAccessFile r = new RandomAccessFile("myfile", "r");

printInterfaceNames(r);

} catch (IOException e) {

System.out.println(e);

}

}

static void printInterfaceNames(Object o) {

Class c = o.getClass();

Class[] theInterfaces = c.getInterfaces();//得到当前类所实现的接口的类对象数组

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

String interfaceName = theInterfaces[i].getName();

System.out.println(interfaceName);

}

}

}

打印出以下信息

java.io.DataOutput

java.io.DataInput

6.检查接口

如果你不确定一个Class对象到底是接口还是类调用isInterface方法。

例子

import java.lang.reflect.*;

import java.util.*;

class SampleCheckInterface {

public static void main(String[] args) {

Class observer = Observer.class;

Class observable = Observable.class;

verifyInterface(observer);

verifyInterface(observable);

}

static void verifyInterface(Class c) {

String name = c.getName();

if (c.isInterface()) {

System.out.println(name + " is an interface.");

} else {

System.out.println(name + " is a class.");

}

}

}

输出如下

java.util.Observer is an interface

Java.util.Observable is a class

7.指定类的域

getFields方法返回一个Field对象的数组包含每一个可访问的public域。

一个共有的域可以被任何一个成员访问

这个类

这个类的超类

实现这个接口的类

这个类实现的接口的接口

以下的程序打印名字和类型属于GridBagConstraints类。注意这个程序首先返回Field对象然后调用getNamegetType方法。

import java.lang.reflect.*;

import java.awt.*;

class SampleField {

public static void main(String[] args) {

GridBagConstraints g = new GridBagConstraints();

printFieldNames(g);

}

static void printFieldNames(Object o) {

Class c = o.getClass();

Field[] publicFields = c.getFields(); //获得这个类所有的public的属性对象数组

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

String fieldName = publicFields[i].getName(); //属性的名字

Class typeClass = publicFields[i].getType(); //属性的类型注意这里返回的是Class对象

String fieldType = typeClass.getName(); //属性的类型的名字

System.out.println("Name: " + fieldName +

", Type: " + fieldType);

}

}

}

输出如下

Name: RELATIVE, Type: int

Name: REMAINDER, Type: int

Name: NONE, Type: int

Name: BOTH, Type: int

Name: HORIZONTAL, Type: int

Name: VERTICAL, Type: int

8.发现类的构造函数

为了创建一个类的实例你调用一个特殊的方法这个方法叫做构造函数。象方法一样,构造函数可以被重载。

你可以获得有关类的构造函数的信息,通过调用getConstructors方法,这个方法返回一个Constructor对象的数组。

你可以使用Constructor类提供的方法麳决定构造函数的名字,修饰符的结合,参数类型,和抛出异常的集合。

以下示例程序打印每一个构造函数的参数类型。程序按以下步骤执行:

1它返回一个Constructor对象的数组通过调用getConstructors

2Constructor数组的每一个元素它创建一个Class对象的数组通过调用getParameterTypesClass对象在数组中显示构造函数的参数。

3. 程序调用getName麳获得类名。

import java.lang.reflect.*;

import java.awt.*;

class SampleConstructor {

public static void main(String[] args) {

Rectangle r = new Rectangle();

showConstructors(r);

}

static void showConstructors(Object o) {

Class c = o.getClass();

Constructor[] theConstructors = c.getConstructors();

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

System.out.print("( ");

Class[] parameterTypes =theConstructors[i].getParameterTypes();

for (int k = 0; k < parameterTypes.length; k ++) {

String parameterString = parameterTypes[k].getName();

System.out.print(parameterString + " ");

}

System.out.println(")");

}

}

}

第一行输出没有参数出现因为特定的Constructor对象显示一个没有参数的构造函数。

( )

( int int )

( int int int int )

( java.awt.Dimension )

( java.awt.Point )

( java.awt.Point java.awt.Dimension )

( java.awt.Rectangle )

9.获得方法信息

为了发现有关类的方法你需要返回相应的Method对象。

调用getMethods方法返回包含Method对象的数组。

你可以使用Method对象麳获得方法的名字返回类型参数类型修饰符集合抛出异常的类型。

例子描述

1返回一个Method对象的数组通过调用getMethods方法。

2遍历每一个元素

a) 返回方法的名字通过调用getName方法。

b) 获得返回类型通过调用getReturnType

c) 创建一个Class对象的数组通过调用getParameterTypes方法。

3Class对象的数组显示方法的参数。为了返回每一个参数的类名,程序调用getName方法。

import java.lang.reflect.*;

import java.awt.*;

class SampleMethod {

public static void main(String[] args) {

Polygon p = new Polygon();

showMethods(p);

}

static void showMethods(Object o) {

Class c = o.getClass();

Method[] theMethods = c.getMethods();

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

String methodString = theMethods[i].getName();

System.out.println("Name: " + methodString);

String returnString =

theMethods[i].getReturnType().getName();

System.out.println(" Return Type: " + returnString);

Class[] parameterTypes = theMethods[i].getParameterTypes();

System.out.print(" Parameter Types:");

for (int k = 0; k < parameterTypes.length; k ++) {

String parameterString = parameterTypes[k].getName();

System.out.print(" " + parameterString);

}

System.out.println();

}

}

}

输出如下

Name: equals

Return Type: boolean

Parameter Types: java.lang.Object

Name: getClass

Return Type: java.lang.Class

Parameter Types:

Name: hashCode

Return Type: int

Parameter Types:

Name: intersects

Return Type: boolean

Parameter Types: double double double double

Name: intersects

Return Type: boolean

Parameter Types: java.awt.geom.Rectangle2D

Name: translate

Return Type: void

Parameter Types: int int

二。课程:操纵对象

 

1.创建对象

1)使用没有参数的构造函数

以下的示例程序创建Rectangle类的实例,通过使用没有参数的构造方法。

import java.lang.reflect.*;

import java.awt.*;

class SampleNoArg {

public static void main(String[] args) {

Rectangle r = (Rectangle) createObject("java.awt.Rectangle");

System.out.println(r.toString());

}

static Object createObject(String className) {

Object object = null;

try {

Class classDefinition = Class.forName(className);

object = classDefinition.newInstance();

} catch (InstantiationException e) {

System.out.println(e);

} catch (IllegalAccessException e) {

System.out.println(e);

} catch (ClassNotFoundException e) {

System.out.println(e);

}

return object;

}

}

输出

java.awt.Rectangle[x=0,y=0,width=0,height=0]

2使用有参数的构造函数

为了使用有参数的构造函数创建对象你可以调用Constructor对象的newInstance方法不是Class对象。

这个技术包含以下步骤

1创建一个Class对象。

2创建一个Constructor对象通过调用Class对象的getConstructorgetConstructor方法有一个参数一个Class对象的数组这些是相

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics