方法
|
说明
|
Constructor getConstructor(Class[] params)
|
获得使用特殊的参数类型的
公共构造函数
|
Constructor[] getConstructors()
|
获得类的所有公共构造函数
|
Constructor getDeclaredConstructor(Class[] params)
|
获得使用特定参数类型的构造函数
(
与访问级别无关
)
|
Constructor[] getDeclaredConstructors()
|
获得类的所有构造函数
(
与访问级别无关
)
|
方法
|
说明
|
Field getField(String name)
|
获得指定的公共字段
|
Field[] getFields()
|
获得类的所有公共字段
|
Field getDeclaredField(String name)
|
获得指定的字段
|
Field[] getDeclaredFields()
|
获得类声明的所有字段
|
方法
|
说明
|
Method getMethod(String name, Class[] params)
|
使用特定的参数类型,获得命名的公共方法
|
Method[] getMethods()
|
获得类的所有公共方法
|
Method getDeclaredMethod(String name, Class[] params)
|
使用特定的参数类型,获得类声明的命名的方法
|
Method[] getDeclaredMethods()
|
获得类声明的所有方法
|
Class c = Class.forName("java.lang.String");
Method m[] = c.getDeclaredMethods();
System.out.println(m[0].toString());
|
class DemoReflection
{
private String name = null;
private void doPrint() {
System.out.println("print.....");
}
};
|
package
cn.softworks.demo;
import
java.lang.reflect.*;
public
class
TestReflection {
public
static
void
main(String args[]) {
try
{
//
通过反映射技术得到DemoReflection的类型
Class cls = Class.forName(
"DemoReflection"
);
//
动态创建DemoReflection类的实力
Object instance = cls.newInstance();
//
通过反映射技术得到DemoReflection的非公有方法doPrint
Method m = cls.getDeclaredMethod(
"doPrint"
,
new
Class[] { String.
class
});
//
表示可以随意访问该类中的方法
m.setAccessible(
true
);
//
调用doPrint方法
m.invoke(instance,
new
Object[] {
"Softworks"
});
}
catch
(Exception ex) {
System.
out
.println(ex);
}
}
};
|
Cleaner clearner = new Cleaner(“Chen.yu”);
Broom broom = new Broom();
cleaner.clear(broom);
|
package
cn.softworks.test;
import
cn.softworks.demo.BeanFactory;
import
cn.softworks.demo.Cleaner;
import
cn.softworks.demo.IClearEquipment;
/**
*
反射机制的测试类
*
*
@version
1.0
*
*
@author
Chen.yu
*
*
上海Softworks对日软件人才培训中心版权所有
*/
public
class
TestClient {
public
static
void
main(String args[]) {
//
通过工厂创建指定的清洁工具类
IClearEquipment eq =
(IClearEquipment) BeanFactory.newInstance().creator(
"ClearEquipment"
);
if
(eq ==
null
)
return
;
//
创建清洁工对象
Cleaner cleaner =
new
Cleaner();
//
清洁工人开始清洁
cleaner.clear(eq);
}
}
|
以下是IClearEquipment接口的代码片断:
package
cn.softworks.demo;
/**
*
*
该接口是的作用是用来定义清洁设备的标准
<br>
*
换句话说,如果要想成为清洁设备,那么就必须要具有清洁能力
*
*
@version
1.0
*
*
@author
Chen.yu
*
*
上海Softworks对日软件人才培训中心版权所有
*/
public
interface
IClearEquipment {
/**
*
清洁设备的清洁方法
<br>
*
不同的清洁设备有不同的清洁方法
*
*/
public
void
clear();
}
|
以下是BeanFactory类的代码片断:
package
cn.softworks.demo;
import
java.io.IOException;
import
java.io.InputStream;
import
java.util.Properties;
/**
*
该类的作用是从配置文件中读取类名,并依靠反射将指定类的实体
<br>
*
返回,以此达到“清洁工”类和“清洁设备”类之间的解耦
<br>
*
*
该类被设置成了单例模式,并在创建指定类的时候加入了同步锁,
<br>
*
以此保证线程安全。
*
*
@version
1.0
*
*
@author
Chen.yu
*
*
上海Softworks对日软件人才培训中心版权所有
*/
public
class
BeanFactory {
/**
*
单例工厂实体
*/
private
static
BeanFactory
instance
=
null
;
/**
*
用于保存softworks.cfg.properties配置文件的实体。
*/
private
static
Properties
config
=
null
;
/**
*
默认配置文件路径
*/
private
static
final
String
CONFIG_PATH
=
"softworks.cfg.properties"
;
|
/**
*
使用了单例模式的工厂类默认构造函数
*
*/
private
BeanFactory() {
//
得到配置文件的路径
InputStream stream = Thread.currentThread().getContextClassLoader()
.getResourceAsStream(
CONFIG_PATH
);
config
=
new
Properties();
try
{
//
将配置文件信息加载到config对象中
config
.load(stream);
}
catch
(IOException e) {
instance
=
null
;
}
}
/**
*
创建BeanFactory实体的静态方法
*
*
@return
BeanFactory
的单例实体
*/
public
synchronized
static
BeanFactory newInstance() {
//
判断BeanFactory的实体是否已经存在
if
(
instance
!=
null
)
return
instance
;
//
如果BeanFactory实体不存在那么立刻创建
instance
=
new
BeanFactory();
return
instance
;
}
|
/**
*
工厂了的创建方法,该方法可以用于创建配置文件中指定key名的类
<br>
*
现在配置文件中有如下信息:
<br>
*
ClearEquipment=cn.softworks.demo.DustCollector
<br>
*
那么当参数被设置成ClearEquipment的时候,通过该方法就会创建
<br>
*
cn.softworks.demo.DustCollector
类的实体。
*
*
@param
key
配置文件中类所对应的Key名
*
*
@return
被加载类的实体
*/
public
synchronized
Object creator(String key) {
if
(
config
==
null
)
return
null
;
//
得到配置文件中的类名
String className =
config
.getProperty(key);
try
{
//
通过反射机制创建类实体
return
Class.forName(className).newInstance();
}
catch
(Exception e) {
return
null
;
}
}
}
|
以下是Broom类的代码片断:
package
cn.softworks.demo;
/**
*
该类是用来描述扫帚这个清洁工具的
<br>
*
它实现了清洁工具接口,所以必须实现清洁方法
*
@version
1.0
*
@author
Chen.yu
*
上海Softworks对日软件人才培训中心版权所有
*/
public
class
Broom
implements
IClearEquipment {
/**
*
扫帚的清洁方法
*/
public
void
clear() {
System.
out
.println(
"The Cleaner Use Broom"
);
}
}
|
package
cn.softworks.demo;
/**
*
该类是用来描述吸尘器这个清洁工具的
<br>
*
它实现了清洁工具接口,所以必须实现清洁方法
*
@version
1.0
*
@author
Chen.yu
*
上海Softworks对日软件人才培训中心版权所有
*/
public
class
DustCollector
implements
IClearEquipment {
/**
*
扫帚的清洁方法
*/
public
void
clear() {
System.
out
.println(
"The Cleaner Use Dust Collector"
);
}
}
|
以下是Cleaner类的代码片断:
package
cn.softworks.demo;
/**
*
该类是用来描述一个清洁工人的
<br>
*
清洁工人会使用清洁设备来进行清洁工作的
*
*
@version
1.0
*
*
@author
Chen.yu
*
*
上海Softworks对日软件人才培训中心版权所有
*/
public
class
Cleaner {
/**
*
这个方法的作用是定义清洁工人的清洁行为
<br>
*
可以肯定的是,清洁工人必须借助清洁设备才能清洁
*
*
@param
eq
使用的清洁设备
*/
public
void
clear(IClearEquipment eq) {
//
清洁工人使用清洁设备进行清洁
eq.clear();
}
}
|