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

 
一.反射定义
 
反射功能:
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---
 
写好的博文,发表以后只剩最前面一小节了,没心思重复写了,就弄成这个样子。。
原文地址:https://www.cnblogs.com/leeeee/p/7276575.html