`
hanqunfeng
  • 浏览: 1541033 次
  • 性别: 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对象的数组这些是相

分享到:
评论

相关推荐

    java反射 java反射 java反射java反射

    Java反射是Java编程语言中的一个重要特性,它允许程序在运行时动态地获取类的信息并操作类的对象。在Java中,反射机制提供了强大的能力,包括在运行时检查类的结构、创建对象实例、调用方法以及访问和修改字段值。...

    Java反射性能测试分析

    ### Java反射性能测试分析 #### 引言 Java反射机制是Java编程语言中一个强大的特性,它允许程序在运行时动态地访问、检测和修改类、接口、字段和方法等对象。然而,反射操作通常会引入额外的开销,这在性能敏感的...

    java反射机制.zip

    java反射机制java反射机制.zipjava反射机制.zipjava反射机制.zipjava反射机制.zipjava反射机制.zipjava反射机制.zipjava反射机制.zipjava反射机制.zipjava反射机制.zipjava反射机制.zipjava反射机制.zipjava反射机制...

    java反射,获取所有属性、方法以及List集合类

    Java反射是Java编程语言中的一个强大工具,它允许运行中的Java程序对自身进行检查并且可以直接操作程序的内部属性。在Java中,反射主要用于在运行时分析类和对象,包括访问私有成员、调用私有方法、创建对象、获取类...

    JAVA反射机制的入门代码

    Java反射机制是Java编程语言中的一个强大特性,它允许运行中的Java程序对自身进行检查并且可以直接操作程序的内部属性。这个特性使得Java具有了高度的灵活性和动态性,尤其是在处理元数据、创建对象、调用私有方法...

    Java反射机制总结

    ### Java反射机制总结 #### 反射的概念与起源 反射的概念最早由Smith于1982年提出,指的是程序能够访问、检测并修改其自身状态或行为的能力。这一概念的提出迅速引起了计算机科学领域的广泛关注,并在之后的研究中...

    java面试题--反射机制

    ### Java反射机制详解 #### 一、引言 在Java面试中,经常会出现与反射机制相关的题目。这是因为Java反射机制不仅是Java语言的一项重要特性,也是理解Java动态特性的关键所在。通过本文,我们将深入探讨Java反射...

    java 反射得到某个方法

    在本文中,我们将深入探讨如何使用Java反射来获取并执行某个特定的方法。 首先,我们需要了解Java反射的基本概念。`java.lang.Class`类是反射的核心,它代表了Java中的每一个类。我们可以通过以下方式获取到一个...

    Java反射经典实例

    Java反射是Java编程语言中的一个强大特性,它允许运行时的程序访问并操作类、接口、字段和方法等信息,即使这些信息在编译时并未明确知晓。在Java中,反射通常通过`java.lang.Class`类和相关的API来实现。本实例将...

    反射实例-JAVA反射机制

    ### 反射实例—JAVA反射机制 #### 一、反射概念及原理 反射在计算机科学领域,特别是程序设计中,是指程序有能力访问、检测和修改其自身的结构和行为。这一概念最早由Smith于1982年提出,并迅速应用于各种编程语言...

    java反射源代码

    Java反射是Java编程语言中的一个强大特性,它允许在运行时检查类、接口、字段和方法的信息,并且能够在运行时动态地创建对象和调用方法。这个特性使得Java具有高度的灵活性,尤其在处理框架、插件系统以及元数据驱动...

    通过Java反射机制获取JavaBean对象

    1.通过Java反射机制获取JavaBean对象。 2.通过JavaBean全路径字符串获取JavaBean对象。 3.获取JavaBean注解信息

    java 反射机制例子

    ### Java反射机制详解 #### 一、反射的基本概念与历史背景 反射的概念最早由Smith在1982年提出,其核心思想是程序有能力访问、检测甚至修改自身的状态和行为。这种能力一经提出,迅速成为了计算机科学领域的研究...

    java反射.pdf

    ### Java反射机制详解 #### 一、什么是Java反射? Java反射是Java编程语言的一个特性,它允许运行时检查和操作程序结构(类、字段、方法等)。反射的主要用途包括但不限于:动态实例化对象、访问私有成员、调用...

    JAVA 反射机制应用

    Java反射机制是Java语言提供的一种强大功能,它允许运行中的Java程序对自身进行检查并且可以直接操作程序的内部属性。在Java中,反射机制的核心类是java.lang.Class,它代表了运行时的类信息。通过Class对象,我们...

    Java方法反射调用demo

    Java反射是Java编程语言中的一个强大特性,它允许在运行时检查类、接口、字段和方法的信息,并且能够在运行时动态地创建对象和调用方法。这个特性使得Java具有了高度的灵活性,常用于框架开发、插件系统、元编程等...

    Java反射机制Demo

    ### Java反射机制详解 #### 一、什么是Java反射机制? Java反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的...

    北大青鸟java反射机制

    Java反射机制是Java编程语言中的一个强大工具,它允许程序在运行时检查并操作类、接口、字段和方法等对象。在"北大青鸟java反射机制"的学习资料中,我们将会深入探讨这一核心特性。 首先,我们要理解反射的核心概念...

Global site tag (gtag.js) - Google Analytics