java反射就是動態的獲取類信息(包括類的繼承,接口的實現,類的方法,屬性 等)。java
@Test public void testClasss() throws Exception{ //第一種 System.out.println(Class.forName("java.lang.String")); //第二種 String str=new String(); System.out.println(str.getClass()); //第三種 System.out.println(String.class); }
@Test public void testClass(){ try { Class clazz= Class.forName("java.lang.String"); //得到類的構造方法 Constructor[] constructorS= clazz.getConstructors(); for (Constructor constructor:constructorS) { System.out.println(constructor); } //獲取指定參數的構造方法 Constructor constructor= clazz.getConstructor(String.class); String str=(String)constructor.newInstance("String字符竄"); //實例化對象(String str=new String()) System.out.println(str); }catch (Exception e){ e.printStackTrace(); } }
//經過反射得到類的方法的全名稱 @Test public static void methodTest() throws ClassNotFoundException { Class<?> clazz = Class.forName("java.lang.String"); Method[] methods = clazz.getMethods(); for (int i = 0; i < methods.length; i++) { System.out.print(Modifier.toString(methods[i].getModifiers()) + " "); System.out.print(methods[i].getReturnType().getSimpleName() + " "); System.out.print(methods[i].getName() + "("); Class[] clType = methods[i].getParameterTypes(); if (clType.length > 0) { for (int j = 0; j < clType.length; j++) { System.out.print(" " + clType[j].getSimpleName() + " " + "arg" + j); if (j < clType.length - 1) { System.out.print(","); } } } System.out.print(")"); Class[] clEx = methods[i].getExceptionTypes(); if (clEx.length > 0) { for (int t = 0; t < clEx.length; t++) { System.out.print("throws " + clEx[t].getSimpleName()); if (t < clEx.length - 1) { System.out.println(","); } } } System.out.println(); } }
Java的代理就是客戶端不之再直接與真實對象打交道,而是經過一箇中間層來訪問,這個中間層就是代理。例如咱們租房子就是一個道理。web
在java的不少應用場景都使用了代理類,好比AspectJ的實現,RPC 遠程調用,Spring的AOP的實現(日誌攔截 • 聲明式事務處理),webservice ,mybatis中實現攔截器插件 等,在java中代理重要有:靜態代理,Jdk的動態代理,CGLIB的動態代理。mybatis
//抽象角色 public interface UserManager { public void addUser(String userId, String userName); public void delUser(String userId); public String findUser(String userId); public void modifyUser(String userId, String userName); }
//真實角色 public class UserManagerImpl implements UserManager { @Override public void addUser(String userId, String userName) { System.out.println("添加用戶!!!!!!!"); } @Override public void delUser(String userId) { System.out.println("刪除用戶!!!!!!!"); } @Override public String findUser(String userId) { System.out.println("查詢用戶!!!!!!!"); return null; } @Override public void modifyUser(String userId, String userName) { System.out.println("修改用戶!!!!!!!"); } }
//代理對象 public class ProxyUserManagerImpl implements UserManager { //持有真實對象的引用 private UserManager userManager; public ProxyUserManagerImpl(UserManager userManager) { this.userManager = userManager; } @Override public void addUser(String userId, String userName) { System.out.println("添加用戶開始!!!!!!!!!!!!!!!"); userManager.addUser(userId,userName); System.out.println("添加用戶結束!!!!!!!!!!!!!!!!!"); } @Override public void delUser(String userId) { } @Override public String findUser(String userId) { return null; } @Override public void modifyUser(String userId, String userName) { } }
public static void main(String[] args) { UserManager userManager=new ProxyUserManagerImpl(new UserManagerImpl()); userManager.addUser("1","張三"); }
//接口
public interface Star { void confer(String str,String str1); void signContract(); void bookTicket(); void sing(); void collectMoney(); }
//真實對象 public class RealStar implements Star { @Override public void bookTicket() { System.out.println("RealStar.bookTicket()"); } @Override public void collectMoney() { System.out.println("RealStar.collectMoney()"); } @Override public void confer(String str,String str1) { System.out.println("RealStar.confer()"); } @Override public void signContract() { System.out.println("RealStar.signContract()"); } @Override public void sing() { System.out.println("RealStar(周杰倫本人).sing()"); } }
//代理對象 public class StarHandler implements InvocationHandler { private Star realStar; public StarHandler(Star realStar) { this.realStar = realStar; } @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { System.out.println("方法執行開始!!!!!!!!!!!!!!!"); for (int i =0;i<args.length;i++){ System.out.println("參數"+i+args[i]); } if (method.getName().equals("confer")) { return method.invoke(realStar,args); } System.out.println("方法執行後!"); return null; } }
//測試類 public class Client { public static void main(String[] args) { Star star=new RealStar(); StarHandler starHandler=new StarHandler(star); Star proxy=(Star) Proxy.newProxyInstance(star.getClass().getClassLoader(),star.getClass().getInterfaces(),starHandler); proxy.confer("你好啊","我很好"); } }
public class User { public void add(Object object){ System.out.println("User.add"); }; public void update(String id){ System.out.println("User.update"); }; }
public class MyInterPatter implements MethodInterceptor { /** * o:cglib生成的代理對象 * method:被代理對象方法 * objects:方法入參 * methodProxy: 代理方法 */ @Override public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable { System.out.println("前置通知!!!!!!!!!!!!!!!!!"); methodProxy.invokeSuper(o,objects); System.out.println("後置通知!!!!!!!!!!!!"); return null; } }
//測試類 public class CglibPatternTest { public static void main(String[] args) { //經過CGLIB動態代理獲取代理對象 Enhancer enhancer=new Enhancer(); // 設置enhancer對象的父類 enhancer.setSuperclass(User.class); // 設置enhancer的回調對象 enhancer.setCallback(new MyInterPatter()); // 建立代理對象 User proxy= (User)enhancer.create(); // 經過代理對象調用目標方法 proxy.add("你好a"); } }