一.反射定义
反射功能:
1.在运行时判断任意一个对象所属的类
2.在运行时构造任意一个类的对象
3.在运行时判断任意一个类所具有的成员变量和方法
4.在运行时调用任意一个对象的方法
5.生成动态代理
二.反射例子
Class<?> classAdminClientFactory
=
Class.forName("com.ibm.websphere.management.AdminClientFactory");
Class<?> classAdminClient
= Class.forName("com.ibm.websphere.management.AdminClient");
Method methodQueryMBeans
= classAdminClient.getMethod("queryMBeans", new
Class<?>[]{ObjectName.class,
QueryExp.class});
Method methodGetAttribute =
classAdminClient.getDeclaredMethod("getAttribute", new
Class<?>[]{ObjectName.class,
String.class});
Object adminClient =
methodCreateAdminClient.invoke(classAdminClientFactory, new
Object[]{props});
long freeMemory = Long.valueOf((String)
methodGetAttribute.invoke(adminClient, new
Object[]{objname, "freeMemory"})) ;
三、动态代理
例子,模拟事务处理:
class TransationInvocationHandler implements InvocationHandler {
Object obj;
public
TransationInvocationHandler(Object obj) {
this.obj = obj;
}
@Override
public Object
invoke(Object proxy, Method method,
Object[] args) throws Throwable {
boolean neeTransaction =
method.getName().startsWith("save")
||
method.getName().startsWith("update")
||
method.getName().startsWith("delete");
if (neeTransaction) {
System.out.println("----Transaction Begin---");
}
Object value = method.invoke(obj, args);
if (neeTransaction) {
System.out.println("----Transaction End---");
}
return value;
}
}
interface Dao {
Object save(Object
obj);
Object update(Object
obj);
Object get(int i);
List<Object> gets();
boolean delete(int
i);
}
class DaoImpl implements Dao {
@Override
public Object
save(Object obj) {
System.out.println("----save---");
return null;
}
@Override
public Object
update(Object obj) {
System.out.println("----update---");
return null;
}
@Override
public Object get(int i)
{
System.out.println("----get---");
return null;
}
@Override
public boolean
delete(int i) {
System.out.println("----delete---");
return true;
}
@Override
public
List<Object> gets() {
System.out.println("----gets---");
return null;
}
}
public class Client {
public static void
main(String[] args) {
Dao dao = new DaoImpl();
Dao daoProxy = (Dao)
Proxy.newProxyInstance(DaoImpl.class.getClassLoader(), new
Class<?>[]{Dao.class}, new
TransationInvocationHandler(dao));
System.out.println();
daoProxy.save(null);
System.out.println();
daoProxy.update(null);
System.out.println();
daoProxy.delete(0);
System.out.println();
daoProxy.get(0);
System.out.println();
daoProxy.gets();
}
}
输出:
----Transaction Begin---
----save---
----Transaction End---
----Transaction Begin---
----update---
----Transaction End---
----Transaction Begin---
----delete---
----Transaction End---
----get---
----gets---
写好的博文,发表以后只剩最前面一小节了,没心思重复写了,就弄成这个样子。。