Java 反射是在運(yùn)行時(shí)獲取類的信息和操作對(duì)象的能力。通過反射,我們可以根據(jù)類名動(dòng)態(tài)創(chuàng)建對(duì)象、調(diào)用類的方法、獲取類的屬性等。
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 對(duì)象,然后使用 newInstance() 方法動(dòng)態(tài)創(chuàng)建實(shí)例。接著,我們利用 getMethod() 方法獲取了 setName() 方法,并通過 invoke() 方法調(diào)用了該方法。最后,我們獲取了 User 類的私有屬性 name,并通過 setAccessible() 方法設(shè)置其可訪問性,最終輸出了該屬性的值。
動(dòng)態(tài)代理則是 Java 反射的一種應(yīng)用。通過動(dòng)態(tài)代理,我們可以在運(yùn)行時(shí)動(dòng)態(tài)代理一個(gè)類,并在代理類中處理對(duì)原始類的操作。常見的應(yīng)用場(chǎng)景包括 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;
}
}
}
上面的代碼中,我們定義了一個(gè) Subject 接口和一個(gè) RealSubject 實(shí)現(xiàn)類。在 DynamicProxy 類中,我們實(shí)現(xiàn)了 InvocationHandler 接口,并利用 invoke() 方法代理了 RealSubject 的 request() 方法。在 Example 類中,我們通過 Proxy.newProxyInstance() 方法動(dòng)態(tài)代理了 RealSubject 類,并在代理類中調(diào)用了 request() 方法。
Java 反射和動(dòng)態(tài)代理是 Java 中非常強(qiáng)大的功能。通過反射,我們可以動(dòng)態(tài)創(chuàng)建、操作對(duì)象;通過動(dòng)態(tài)代理,我們可以在不改變?cè)碱惖那闆r下對(duì)其進(jìn)行增強(qiáng)處理。掌握這兩個(gè)功能對(duì)我們?cè)?Java 開發(fā)中的工作非常有幫助。