Java 是一門十分強大的編程語言,不僅支持面向對象編程,還支持動態代理和反射功能。下面我們將分別介紹它們。
代理是一種代替某個對象進行某項操作的機制。Java 是一門體系結構的完整語言,支持靜態代理和動態代理兩種方式。
// 靜態代理類 public class UserDaoProxy implements IUserDao { private IUserDao target; public UserDaoProxy(IUserDao target) { this.target = target; } public void save() { System.out.println("開始事務..."); target.save(); System.out.println("提交事務..."); } } // 測試類 public static void main(String[] args) { IUserDao target = new UserDao(); IUserDao proxy = new UserDaoProxy(target); proxy.save(); }
以上代碼展示了一個簡單的靜態代理示例。在動態代理中,代理類并不是在編譯期間確定的,而是在程序運行時根據需要動態生成。
// 動態代理類 public class MyInvocationHandler implements InvocationHandler { private Object target; public MyInvocationHandler(Object target) { this.target = target; } public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { System.out.println("開始事務..."); Object result = method.invoke(target, args); System.out.println("提交事務..."); return result; } } // 測試類 public static void main(String[] args) { IUserDao target = new UserDao(); System.out.println(target.getClass()); IUserDao proxy = (IUserDao) new MyInvocationHandler(target).getProxy(); System.out.println(proxy.getClass()); proxy.save(); }
反射是 Java 的一個重要特征,它允許通過程序在運行時檢查對象和類的信息,并可以在運行時修改該信息。反射提供了許多輔助程序,例如 Class 類、Constructor 類和 Method 類等。
// 獲取類信息 Class>clazz = Class.forName("com.example.UserDao"); System.out.println(clazz.getSimpleName()); // 獲取構造方法信息 Constructor>[] constructors = clazz.getDeclaredConstructors(); for (Constructor>constructor : constructors) { System.out.println(constructor); } // 獲取方法信息 Method[] methods = clazz.getDeclaredMethods(); for (Method method : methods) { System.out.println(method); }
以上代碼展示了反射的一些常用操作,大家可以根據需要進行學習和使用。