JAVA反射機制是在運行狀態中,對於任意一個類,都可以知道這個類的全部屬性和方法;對於任意一個對象,都可以調用它的任意一個方法和屬性;這種動態獲取的信息以及動態調用對象的方法的功能稱爲java語言的反射機制。java
Java中有個Object 類,是全部Java 類的繼承根源,其內聲明瞭數個應該在全部Java 類中被改寫的方法:hashCode()、equals()、clone()、toString()、getClass()等。其中getClass()返回一個Class 對象。Class對象十分特殊。他是Java中全部類的實例,藉助它能夠實現對一個對象的操做。數組
建立Person類this
public class Person { private String name; private String age; private void shot(){ System.out.println("!!!"); } protected void shot1() { System.out.println("111"); } public String getAge() { return age; } public String getName() { return name; } public void setAge(String age) { this.age = age; } public void setName(String name) { this.name = name; } }
經過getClass()code
Person person = new Person(); Class<?> class2 = person.getClass();
經過Class.forName()對象
Class<?> class1 = Class.forName("test0118.testR.Person");
.class繼承
Class<?> class3 = Person.class;
獲取類的屬性接口
getFields()只能訪問類中聲明爲公有的字段,私有的字段它沒法訪問,能訪問從其它類繼承來的公有方法.get
getDeclaredFields()能訪問類中全部的字段,與public,private,protect無關,不能訪問從其它類繼承來的方法hash
Field[] fields = class1.getDeclaredFields(); Field[] fields2 = class1.getFields(); for (Field field : fields) { System.out.println(Modifier.toString(field.getModifiers()) + field.getName()); } for(Field field:fields2){ System.out.println(Modifier.toString(field.getModifiers())+field.getName());//因爲Person類中並無公有字段,因此該循環不輸出任何值 } /** 輸出: privatename privateage */
獲取類屬性的修飾符
上述代碼中有一個方法Modifier.toString(field.getModifiers())
便是獲取該屬性的修飾符,field.getModifiers()
返回一個int值,將該值轉化爲對應的描述要用到Modifier.toString()
方法。class
對類的屬性進行操做
Field field = class1.getField("name"); Object object = class1.newInstance(); field.setAccessible(true);//打破了封裝的特性,容許對私有屬性直接進行操做 field.set(object, "123"); System.out.println(field.get(object));
獲取類的方法
getMethods()返回某個類的全部公用(public)方法包括其繼承類的公用方法,固然也包括它所實現接口的方法。
getDeclaredMethods()對象表示的類或接口聲明的全部方法,包括公共、保護、默認(包)訪問和私有方法,但不包括繼承的方法。固然也包括它所實現接口的方法。
Method[] methods = class1.getDeclaredMethods(); Method[] methods2 = class1.getMethods();
獲取方法的參數和返回值的類型
method.getParameterTypes():獲取方法參數類型,返回Class<?>數組
method.getReturnType():獲取方法返回值類型,返回Class<?>對象
Class<?>[] ty = method.getParameterTypes(); Class<?> rty = method.getReturnType();
使用反射調用方法
method.invoke(對象,參數...)
Object object = class1.newInstance(); Method method = class1.getMethod("setName", Class.forName("java.lang.String")); method.invoke(object, "123123"); Method method2 = class1.getMethod("getName"); System.out.println((String) method2.invoke(object)); System.out.println(method.getReturnType());