您的位置:首页 > 编程语言 > Java开发

Java反射机制剖析(二)-功能以及举例

2012-02-07 16:04 288 查看
《java反射机制剖析(一)》的API我们看到了许多接口和类,我们能够通过这些接口做些什么呢?

从上篇API中我们能看到它能够完成下面的这些功能:

1) 获得类


A. 运用getClass() (每个class都有此函数)

i. String str = "abc";

ii. Class c1 = str.getClass();

B. 运用Class.forName() (static method 最常被使用)

i. Class c1 = Class.forName ("java.lang.String");

ii. Class c2 = Class.forName ("java.awt.Button");

C. 运用 .class 语法

i. Class c1 = String.class;

ii. Class c2 = java.awt.Button.class;

iii. Class c4 = int.class;

iv. Class c5 = int[].class;

D. 运用 TYPE语法 ( primitive wrapper classes 基本数据类型包装类的 TYPE语法)

i. Class c1 = Boolean.TYPE;



2) 获得属性(这个功能的实例见Java反射机制剖析(2))


以下四个方法可以获得属性,主要参见的是Java.lang.class



Public Field getField

(String name)



返回一个 Field 对象,它反映此 Class 对象所表示的类或接口的指定公共成员字段




public Field[] getFields()



返回一个包含某些 Field 对象的数组,这些对象反映此 Class 对象所表示的类或接口的所有可访问公共字段



Public Field

getDeclaredField(String name)



返回一个 Field 对象,该对象反映此 Class 对象所表示的类或接口的指定已声明字段



public Field[]

getDeclaredFields()



返回 Field 对象的一个数组,这些对象反映此 Class 对象所表示的类或接口所声明的所有字段


3) 获得方法()


以下四个方法可以获得方法,要参见的是Java.lang.class



public Method

getMethod(String name,

... )

返回一个 Method 对象,它反映此 Class 对象所表示的类或接口的指定公共成员方法

public Method[] getMethods()

返回一个包含某些 Method 对象的数组,这些对象反映此 Class 对象所表示的类或接口(包括那些由该类或接口声明的以及从超类和超接口继承的那些的类或接口)的公共 member 方法

public Method

getDeclaredMethod(String name,…)

返回一个 Method 对象,该对象反映此 Class 对象所表示的类或接口的指定已声明方法

public Method[]

getDeclaredMethods()

返回 Method 对象的一个数组,这些对象反映此 Class 对象表示的类或接口声明的所有方法,包括公共、保护、默认(包)访问和私有方法,但不包括继承的方法

4) 获取类的构造器


以下四个方法可以获得方法,要参见的是Java.lang.class



public Constructor

getConstructor(Class<?>... )

返回一个 Constructor 对象,它反映此 Class 对象所表示的类的指定公共构造方法

public Constructor<?>[]

getConstructors()

返回一个包含某些 Constructor 对象的数组,这些对象反映此 Class 对象所表示的类的所有公共构造方法

Public Constructor<T>

getDeclaredConstructor(Class<?>...)

返回一个 Constructor 对象,该对象反映此 Class 对象所表示的类或接口的指定构造方法

public Constructor<?>[]

getDeclaredConstructors()

返回 Constructor 对象的一个数组,这些对象反映此 Class 对象表示的类声明的所有构造方法。它们是公共、保护、默认(包)访问和私有构造方法


示例代码:



import java.lang.reflect.Constructor;

public class TestConstructor {
/**
* @param args
* @throws ClassNotFoundException
* @throws SecurityException
* @throws NoSuchMethodException
*/
public static void main(String[] args) throws Exception {
// TODO Auto-generated method stub
Class classType=Class.forName(args[0]);
Constructor Constructor= classType.getConstructor();

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

}

}




5) 新建类的实例

调用类的Class对象的newInstance方法

示例:

import java.lang.reflect.Constructor;

public class TestConstructor {
/**
* @param args
* @throws ClassNotFoundException
* @throws SecurityException
* @throws NoSuchMethodException
*/
public static void main(String[] args) throws Exception {
// TODO Auto-generated method stub
Class classType=Class.forName(args[0]);
//Constructor Constructor= classType.getConstructor();
Object inst=classType.newInstance();
System.out.println(inst);
}
}


调用默认Constructor对象的newInstance方法

示例:

import java.lang.reflect.Constructor;

public class TestConstructor {
/**
* @param args
* @throws ClassNotFoundException
* @throws SecurityException
* @throws NoSuchMethodException
*/
public static void main(String[] args) throws Exception {
// TODO Auto-generated method stub
Class classType=Class.forName(args[0]);
Constructor Constructor= classType.getConstructor();
Object inst=Constructor.newInstance();
System.out.println(inst);
}
}


调用带参数Constructor对象的newInstance方法

示例:

Class classType=User.class
Constructor constructor2 =
classType.getDeclaredConstructor(int.class, String.class);

Object inst = constructor2.newInstance(1, "123");

System.out.println(inst);


内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: