Java 反射是在運行時獲取類的信息和操作對象的能力。通過反射,我們可以根據類名動態創建對象、調用類的方法、獲取類的屬性等。
public class Example {
public static void main(String[] args) throws Exception {
Class cls = Class.forName("com.example.User");
Object obj = cls.newInstance();
Method method = cls.getMethod("setName", String.class);
method.invoke(obj, "Lucy");
Field field = cls.getDeclaredField("name");
field.setAccessible(true);
System.out.println(field.get(obj));
}
}
上面的代碼中,我們首先利用類的全限定名獲取了 Class 對象,然后使用 newInstance() 方法動態創建實例。接著,我們利用 getMethod() 方法獲取了 setName() 方法,并通過 invoke() 方法調用了該方法。最后,我們獲取了 User 類的私有屬性 name,并通過 setAccessible() 方法設置其可訪問性,最終輸出了該屬性的值。
動態代理則是 Java 反射的一種應用。通過動態代理,我們可以在運行時動態代理一個類,并在代理類中處理對原始類的操作。常見的應用場景包括 AOP(面向切面編程)等。
public class Example {
public static void main(String[] args) {
RealSubject real = new RealSubject();
InvocationHandler handler = new DynamicProxy(real);
Subject subject = (Subject) Proxy.newProxyInstance(handler.getClass().getClassLoader(), real
.getClass().getInterfaces(), handler);
subject.request();
}
interface Subject {
void request();
}
static class RealSubject implements Subject {
public void request() {
System.out.println("RealSubject executed");
}
}
static class DynamicProxy implements InvocationHandler {
private Object target;
public DynamicProxy(Object target) {
this.target = target;
}
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println("invoke start");
Object result = method.invoke(target, args);
System.out.println("invoke end");
return result;
}
}
}
上面的代碼中,我們定義了一個 Subject 接口和一個 RealSubject 實現類。在 DynamicProxy 類中,我們實現了 InvocationHandler 接口,并利用 invoke() 方法代理了 RealSubject 的 request() 方法。在 Example 類中,我們通過 Proxy.newProxyInstance() 方法動態代理了 RealSubject 類,并在代理類中調用了 request() 方法。
Java 反射和動態代理是 Java 中非常強大的功能。通過反射,我們可以動態創建、操作對象;通過動態代理,我們可以在不改變原始類的情況下對其進行增強處理。掌握這兩個功能對我們在 Java 開發中的工作非常有幫助。
上一篇css 如何圖片往下移