非深入探尋Java反射機制 (Class)

來源:互聯網
上載者:User
Classes

通過反射機制我們可以在運行時探尋類的內部結構,並擷取以下資訊

  • Class Name
  • Class Modifiers (public, protected, synchronized等)
  • Package Info
  • Super Class
  • Implemented Interfaces
  • Constructors
  • Methods
  • Fields
  • Annotations

The Class Object

所有的Java類型(包括int等基本類型)以及數組(arrays)都有相關聯的ClassObject。

The Class name

如果在編譯時間知道該類的名字,就可以如下擷取該類的Class執行個體:

import java.lang.reflect.Method;public class HelloJava {    public static void main(String[] args) {        Class myClass = HelloJava.class;    }}

如果在運行時知道該類的名字(字串類型),則可以如下擷取該類的Class執行個體:

package tao.xiao.action;import java.lang.reflect.Method;public class HelloJava {    public static void main(String[] args) throws ClassNotFoundException {        Class myClass = Class.forName("tao.xiao.action.HelloJava");        System.out.println(myClass.getName());        // tao.xiao.action.HelloJava        System.out.println(myClass.getSimpleName());// HelloJava    }}

注意,這裡的類名必須是全限定名(含有包名)。如果運行時在classpath中找不到該類,則會拋出ClassNofFoundException。

Modifiers

package tao.xiao.action;import java.lang.reflect.Modifier;public class HelloJava {public static void main(String[] args) throws ClassNotFoundException {Class myClass = Class.forName("tao.xiao.action.HelloJava");int modifiers = myClass.getModifiers();System.out.println(Modifier.isPublic(modifiers));// trueSystem.out.println(Modifier.isPrivate(modifiers));// falseSystem.out.println(Modifier.isSynchronized(modifiers));// falseSystem.out.println(Modifier.isStatic(modifiers));// false}}

Package Info

package tao.xiao.action;public class HelloJava {public static void main(String[] args) throws ClassNotFoundException {Class myClass = Class.forName("tao.xiao.action.HelloJava");Package pack = myClass.getPackage();System.out.println(pack);}}

Superclass

package tao.xiao.action;public class HelloJava {public static void main(String[] args) throws ClassNotFoundException {Class classB= Class.forName("tao.xiao.action.B"); // 這裡B extends AClass classA = classB.getSuperclass();System.out.println(classA.getName());      // 輸出是 tao.xiao.action.A}}

 

Implemented Interfaces

package tao.xiao.action;public class HelloJava {public static void main(String[] args) throws ClassNotFoundException {Class classB = Class.forName("tao.xiao.action.B");Class[] interfaces = classB.getInterfaces();  // 一個類可以實現多個介面,因此這裡返回的是Class[]類型for (Class I : interfaces)System.out.println(I.getName());}}

這裡,有兩個介面IT1和IT2,類A和類B的聲明為

class A implements IT1 ... class B extends A implements IT2 ...

getInterface方法只能返回該類直接實現的介面,因此這裡的輸出為 tao.xiao.action.IT2

Constructors, Methods, Fields and Annotations

package tao.xiao.action;import java.lang.annotation.Annotation;import java.lang.reflect.Constructor;import java.lang.reflect.Field;import java.lang.reflect.Method;public class HelloJava {public int a;private double b;protected long c;public HelloJava()  {}public HelloJava(String s) {}public void f1() {}public String f2(float f) { return "xxx"; }@Overridepublic String toString() { return "xxx"; }public static void main(String[] args) throws ClassNotFoundException {Class myClass = Class.forName("tao.xiao.action.HelloJava");Constructor[] constructors = myClass.getConstructors();for (Constructor c : constructors)System.out.println("Constructor ==> " + c);Method[] methods = myClass.getMethods();for (Method m : methods)System.out.println("Method ==> " + m);Field[] fields = myClass.getFields();                   //  只會返回public成員for (Field f : fields)System.out.println("Field ==> " + f);Annotation[] annotations = myClass.getAnnotations();    // 不會返回@Override註解for (Annotation an : annotations)System.out.println("Annotation ==> " + an);}}

輸出為:

Constructor ==> public tao.xiao.action.HelloJava()Constructor ==> public tao.xiao.action.HelloJava(java.lang.String)Method ==> public void tao.xiao.action.HelloJava.f1()Method ==> public java.lang.String tao.xiao.action.HelloJava.f2(float)Method ==> public static void tao.xiao.action.HelloJava.main(java.lang.String[]) throws java.lang.ClassNotFoundExceptionMethod ==> public java.lang.String tao.xiao.action.HelloJava.toString()Method ==> public final native void java.lang.Object.wait(long) throws java.lang.InterruptedExceptionMethod ==> public final void java.lang.Object.wait() throws java.lang.InterruptedExceptionMethod ==> public final void java.lang.Object.wait(long,int) throws java.lang.InterruptedExceptionMethod ==> public boolean java.lang.Object.equals(java.lang.Object)Method ==> public native int java.lang.Object.hashCode()Method ==> public final native java.lang.Class java.lang.Object.getClass()Method ==> public final native void java.lang.Object.notify()Method ==> public final native void java.lang.Object.notifyAll()Field ==> public int tao.xiao.action.HelloJava.a

下一章:非深入探尋Java反射機制(Constructors)

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.