您好,登錄后才能下訂單哦!
什么是反射?
Java 反射,就是在運行狀態(tài)中。
獲取任意類的名稱、package信息、所有屬性、方法、注解、類型、類加載器等
獲取任意對象的屬性,并且能改變對象的屬性
調用任意對象的方法
判斷任意一個對象所屬的類
實例化任意一個類的對象
Java 的動態(tài)就體現(xiàn)在這。通過反射我們可以實現(xiàn)動態(tài)裝配,降低代碼的耦合度;動態(tài)代理等。反射的過度使用會嚴重消耗系統(tǒng)資源。
JDK 中 java.lang.Class 類,就是為了實現(xiàn)反射提供的核心類之一。
獲取 Class 的方法 、一個 jvm 中一種 Class 只會被實例化一次
package constxiong.interview;
/**
* 測試 Class 類相關
* @author ConstXiong
* @date 2019-06-14 10:13:05
*/
public class TestClass {
public static void main(String[] args) throws ClassNotFoundException {
testGetClass();
}
/**
* 測試獲取 Class 對象,獲取 Class 名稱
* @throws ClassNotFoundException
*/
@SuppressWarnings("rawtypes")
public static void testGetClass() throws ClassNotFoundException {
TestClass t = new TestClass();
Class class1 = t.getClass();
System.out.println(class1.getName());
Class class2 = TestClass.class;
System.out.println(class2.getName());
Class class3 = Class.forName("constxiong.interview.TestClass");
System.out.println(class3.getName());
//一個 jvm 中一種 Class 只會被實例化一次,對上面的 Class 實例進行判斷發(fā)現(xiàn)都是相等的
System.out.println(class1 == class2);
System.out.println(class1 == class3);
}
}
Class 類中方法測試
package constxiong.interview;
/**
* 測試 Class 類相關
* @author ConstXiong
* @date 2019-06-14 10:13:05
*/
public class TestClass {
private int i = 0;
public int j = 1;
private void t() {
System.out.println("調用 TestClass 對象的 t() 方法");
}
public static void main(String[] args) throws ClassNotFoundException {
testClassMethod();
}
/**
* 測試 Class 對象的方法
*/
public static void testClassMethod() {
Class clazz = TestClass.class;
System.out.println("clazz.getName() --> " + clazz.getName());//獲取類全名(包含路徑)
System.out.println();
System.out.println("clazz.getSimpleName() --> " + clazz.getSimpleName());//獲取類簡稱
System.out.println();
System.out.println("clazz.getSuperclass() --> " + clazz.getSuperclass());//獲取父類
System.out.println();
System.out.println("clazz.isInterface() --> " + clazz.isInterface());//判斷是否為接口
System.out.println();??無錫婦科醫(yī)院 http://mobile.wxbhnkyy39.com/
System.out.println("clazz.getFields() --> " + join(clazz.getFields(), "\r\n"));//獲取 public 字段,包含父類 public 字段
System.out.println();
System.out.println("clazz.getDeclaredFields() --> " + join(clazz.getDeclaredFields(), "\r\n"));//獲取所有字段
System.out.println();
System.out.println("clazz.getMethods() --> " + join(clazz.getMethods(), "\r\n"));//獲取 public 方法,包含父類 public 方法
System.out.println();
System.out.println("clazz.getDeclaredMethods() --> " + join(clazz.getDeclaredMethods(), "\r\n"));//獲取所有字段
System.out.println();
System.out.println("clazz.getConstructors() --> " + join(clazz.getConstructors(), "\r\n"));//獲取構造方法
System.out.println();
try {
clazz.newInstance().t();//實例化 TestClass 對象,調用對象中的 t() 方法
} catch (InstantiationException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
}
}
/**
* 拼接數(shù)組成字符串
* @param objs
* @param s
* @return
*/
private static String join(Object[] objs, String s) {
StringBuilder r = new StringBuilder();
for (Object obj : objs) {
r.append(obj).append(s);
}
return r.toString();
}
}
免責聲明:本站發(fā)布的內容(圖片、視頻和文字)以原創(chuàng)、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關證據(jù),一經查實,將立刻刪除涉嫌侵權內容。