一、getclass()方法簡介
getclass()是Java中Object的一個實例方法,用於獲取一個對象的類類型(Class)。可以通過這個方法獲取任意一個對象所屬的類的類型,並且通過該類型可以獲取該類的屬性、方法等信息。
二、獲取對象的Class類型
在Java中,有三種獲取Class類型的方式:
1. getClass()方法
public final Class getClass()
直接調用對象的getClass()方法即可獲取對象的Class類型,如下所示:
String str = "hello world";
Class<? extends String> clazz = str.getClass();
System.out.println(clazz.getName());
上述代碼中,我們通過字元串”hello world”獲取了其類型的Class,然後列印出該Class的名稱,輸出結果為:
java.lang.String
2. .class語法
使用.class語法能夠在編譯時確定類型,例如:
Class<Integer> clazz = int.class;
上述代碼中,我們通過int類型的.class語法,獲取其Class類型,並且指定泛型為Integer,最終得到一個Class<Integer>類型的變數clazz。
3. Class.forName()
使用Class.forName()方法能夠動態載入一個類,並且獲取該類的Class類型,例如:
Class<?> clazz = Class.forName("java.lang.String");
System.out.println(clazz.getName());
上述代碼中,我們通過Class.forName()方法動態載入了java.lang.String類,然後獲取了該類的Class類型,並列印出該Class的名稱,輸出結果為:
java.lang.String
三、應用場景
getclass()方法在Java的反射機制中應用廣泛,例如:
1. 獲取類的屬性信息
使用getclass()方法可以獲取一個類的屬性信息,例如:
String str = "hello world";
Class<?> clazz = str.getClass();
Field[] fields = clazz.getDeclaredFields();
for (Field f : fields) {
System.out.println(f.getName());
}
上述代碼中,我們通過字元串”hello world”獲取了其類型的Class,並獲取該類的所有屬性信息(包括private屬性),然後遍歷輸出各個屬性的名稱。
2. 獲取類的方法信息
使用getclass()方法可以獲取一個類的方法信息,例如:
String str = "hello world";
Class<?> clazz = str.getClass();
Method[] methods = clazz.getMethods();
for (Method m : methods) {
System.out.println(m.getName());
}
上述代碼中,我們通過字元串”hello world”獲取了其類型的Class,並獲取了該類所有的公共方法信息,並遍歷輸出各個方法的名稱。
3. 動態代理
使用getclass()方法可以實現動態代理,例如:
interface Hello {
void sayHello();
}
class HelloImpl implements Hello {
public void sayHello() {
System.out.println("hello world");
}
}
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("before");
Object result = method.invoke(target, args);
System.out.println("after");
return result;
}
public Object getProxy() {
return Proxy.newProxyInstance(target.getClass().getClassLoader(), target.getClass().getInterfaces(), this);
}
}
public class Main {
public static void main(String[] args) {
Hello hello = new HelloImpl();
DynamicProxy dynamicProxy = new DynamicProxy(hello);
Hello proxy = (Hello) dynamicProxy.getProxy();
proxy.sayHello();
}
}
上述代碼中,我們定義了一個Hello介面和HelloImpl實現類,並且通過動態代理類DynamicProxy實現了對HelloImpl的代理。在這個過程中,我們通過getclass()方法獲取了原始對象的Class類型,並且通過該類型獲取了該對象所實現的介面類型(target.getClass().getInterfaces()),最終得到了一個代理對象。
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/152508.html