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

笔记:Java反射以及动态代理

2014-05-28 08:46 330 查看
一.反射定义

反射功能:
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---

写好的博文,发表以后只剩最前面一小节了,没心思重复写了,就弄成这个样子。。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: