java反射機制reflect 分析Object對象,reflectobject
直接看一個執行個體吧
</pre><pre name="code" class="java">package reflect;import java.lang.reflect.Constructor;import java.lang.reflect.Field;import java.lang.reflect.Method;import java.lang.reflect.Modifier;class Behavior {private long distance;private long amount;public long getDistance() {return distance;}public void setDistance(long distance) {this.distance = distance;}public long getAmount() {return amount;}public void setAmount(long amount) {this.amount = amount;}public String walk() {return "走了" + distance + "公裡";}public String eat() {return "吃了" + amount + "碗飯";}}class Person extends Behavior {private String username;private int age;static char sex;protected final double high = 0;public String[] hobby;public Behavior be;public String getUsername() {return username;}public void setUsername(String username) {this.username = username;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}public char getSex() {return sex;}public static void setSex(char sex) {Person.sex = sex;}public double getHigh() {return high;}public String[] getHobby() {return hobby;}public void setHobby(String[] hobby) {this.hobby = hobby;}public Behavior getBe() {return be;}public void setBe(Behavior be) {this.be = be;}public Person() {}public Person(String username, int age, String[] hobby, Behavior be) {super();this.username = username;this.age = age;this.hobby = hobby;this.be = be;}public String fun2(int a, int b, int c, String d, double e, float f, char g) {return a + b + c + d + e + f + g;}}public class ObjectAnalyzer {public void printFields(Field[] fields) {for (int i = 0; i < fields.length; i++) {Field f = fields[i];int m = f.getModifiers();String name = f.getName();Class<?> clazz = f.getType();System.out.println(Modifier.toString(m) + " " + clazz.getName()+ " " + name);}}public void printConstructor(Constructor<?>[] c) {for (int i = 0; i < c.length; i++) {Constructor<?> con = c[i];String name = con.getName();int m = con.getModifiers();Class<?>[] clazz = con.getParameterTypes();System.out.print(Modifier.toString(m) + " " + name + "(");for (int j = 0; j < clazz.length; j++) {System.out.print(clazz[j].getName() + " ");}System.out.println(")");}}public void printMethod(Method[] methods) {for (int i = 0; i < methods.length; i++) {Method m = methods[i];int modi = m.getModifiers();String name = m.getName();Class<?> returnType = m.getReturnType();Class<?>[] paramType = m.getParameterTypes();System.out.print(Modifier.toString(modi) + " "+ returnType.getName() + " " + name + "(");for (int j = 0; j < paramType.length; j++) {System.out.print(paramType[j].getName() + " ");}System.out.println(")");}}public void analyzer(Object obj) {Class<?> clazz = obj.getClass();Field[] fields = clazz.getDeclaredFields();Constructor<?>[] c = clazz.getDeclaredConstructors();Method[] method = clazz.getDeclaredMethods();//Method[] method = clazz.getMethods();System.out.println("=====屬性變數的分析=====");System.out.println("Fields長度:" + fields.length + " 變數如下");printFields(fields);System.out.println("=====構造方法分析=====");printConstructor(c);System.out.println("=====方法分析=====");printMethod(method);}public static void main(String[] args) {// TODO Auto-generated method stubBehavior be = new Behavior();Person p = new Person("chiwei", 26, new String[] { "1", "2" }, be);new ObjectAnalyzer().analyzer(p);}}
運行結果如下:
=====屬性變數的分析=====
Fields長度:6 變數如下
private java.lang.String username
private int age
static char sex
protected final double high
public [Ljava.lang.String; hobby
public reflect.Behavior be
=====構造方法分析=====
public reflect.Person()
public reflect.Person(java.lang.String int [Ljava.lang.String; reflect.Behavior )
=====方法分析=====
public void setUsername(java.lang.String )
public int getAge()
public void setAge(int )
public char getSex()
public static void setSex(char )
public double getHigh()
public [Ljava.lang.String; getHobby()
public void setHobby([Ljava.lang.String; )
public reflect.Behavior getBe()
public void setBe(reflect.Behavior )
public java.lang.String fun2(int int int java.lang.String double float char )
public java.lang.String getUsername()
Java Reflection (JAVA反射)機制詳解
又開始倒分了,有意思嗎?
java反射機制詳解
在Java運行時刻,能否知道一個類的屬性方法並調用改動之?對於任意一個對象,能否知道他的所屬類,並調用他的方法?答案是肯定的。這種動態擷取資訊及動態調用方法的機制在Java中稱為“反射”(reflection)。
Java反射機制主要提供以下功能:
在運行時判斷任意一個對象所屬的類;
在運行時構造任意一個類的對象;
在運行時判斷任意一個類所具有的成員變數和方法;
在運行時調用任意一個對象的方法。
Reflection 是Java被視為動態(或准動態)語言的一個關鍵性質。這個機制允許程式在運行時透過Reflection APIs取得任何一個已知名稱的class的內部資訊,包括其modifiers(諸如public, static 等等)、superclass(例如Object)、實現之interfaces(例如Serializable),也包括fields和methods 的所有資訊,並可於運行時改變fields內容或調用methods。
一般而言,開發人員社群說到動態語言,大致認同的一個定義是:“程式運行時,允許改變程式結構或變數類型,這種語言稱為動態語言”。
在JDK中,主要由以下類來實現Java反射機制,這些類都位於java.lang.reflect包中:
Class類:代表一個類;
Field 類:代表類的成員變數(成員變數也稱為類的屬性);
Method類:代表類的方法;
Constructor 類:代表類的構造方法;
Array類:提供了動態建立數組,以及訪問數組的元素的靜態方法;
至於全部的你可以看看參考資料。我看這個資料不錯
參考資料:apps.hi.baidu.com/share/detail/24992875