1. 程式人生 > >非深入探尋Java反射機制 (Class)

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

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));		// true
		System.out.println(Modifier.isPrivate(modifiers));		// false
		System.out.println(Modifier.isSynchronized(modifiers));	// false
		System.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 A
		Class 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"; }
	
	@Override
	public 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.ClassNotFoundException
Method ==> public java.lang.String tao.xiao.action.HelloJava.toString()
Method ==> public final native void java.lang.Object.wait(long) throws java.lang.InterruptedException
Method ==> public final void java.lang.Object.wait() throws java.lang.InterruptedException
Method ==> public final void java.lang.Object.wait(long,int) throws java.lang.InterruptedException
Method ==> 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反射機制 Class

Classes 通過反射機制我們可以在執行時探尋類的內部結構,並獲取以下資訊 Class NameClass Modifiers (public, protected, synchronized等)Package InfoSuper ClassImplemented In

深入探尋Java反射機制

通過Java的反射(Reflection)機制,即使在編譯時不知道class name和method name等資訊,也可以在執行時獲取class、interface、fields和methods等相關資訊,還可以建立新的例項、呼叫方法以及獲取/設定屬性值。 本文將介

Java-反射機制reflection

一.概述 反射機制是Java提供的一項比較高階的功能,一般的Java開發者使用它的時候相對比較少。但是,java的反射卻是大多數框架的基礎,例如,Struts,Hibernate,Spring等,反射機制就好像外科醫生的解剖工具,突然從外太空來了一個人,如何知道他的具體構造呢?最好的辦法

java反射機制2- 實踐:反射機制+動態代理實現模擬RMI遠端方法呼叫

1 涉及主要知識點   1、RMI(Remote Method Invocation):遠端方法呼叫是一種計算機之間利用遠端物件互相呼叫實現雙方通訊的一種通訊機制。使用這種機制,某一臺計算機上

菜鳥學Java——Java反射機制

上一篇博文《菜鳥學Java(九)——Java反射機制(一)》裡面,向大家介紹了什麼是Java的反射機制,以及Java的反射機制有什麼用。上一篇比較偏重理論,理論的東西給人講出來總感覺虛無縹緲,還是結合一些例項比較形象具體。那麼今天就結合更多的例項具體說說。 例項一:獲得

Java 反射機制1

一、準備知識: 1、什麼是 Java 反射機制? JAVA 反射機制是在執行狀態中,對於任意一個類,都能夠知道這個類的所有屬性和方法;對於任意一個物件,都能夠呼叫它的任意一個方法和屬性;這種動態獲取的資訊以及動態呼叫物件的方法的功能稱為java語言的反射

通俗易懂解釋java反射機制

Java的反射機制是Java特性之一,反射機制是構建框架技術的基礎所在。靈活掌握Java反射機制,對大家以後學習框架技術有很大的幫助。  那麼什麼是Java的反射呢?        大家都知道,要讓Java程式能夠執行,那麼就得讓Java類要被Java虛擬機器載入。Java

深入理解java反射機制轉載

今天將從以下4方面來系統的學習一下java的反射機制: java反射是什麼 java反射(Reflection)底層實現原理 java反射的簡單演示 java反射的應用場景 1,java反射是什麼 首先大家應該先了解兩個概念,編譯

Java中的反射機制

erl void port 令行 sage [0 ray 輸出 我們 基本概念   在Java運行時環境中,對於任意一個類,能否知道這個類有哪些屬性和方法?對於任意一個對象,能否調用它的任意一個方法?   答案是肯定的。   這種動態獲取類的信息以及動態調用對象的方法的功能

java反射機制重要

ati 接收 模式 stack 判斷 try per image declare 1,反射的概念 JAVA反射機制是在運行狀態中,對於任意一個類,都能夠知道這個類的所有屬性和方法;對於任意一個對象,都能夠調用它的任意一個方法和屬性;這種動態獲取的信息以及動態調用對象的方法

Java動態性之反射機制reflection

clas nts 一次 完全 名稱 set 靜態類 對象實例 以及 說到反射機制,第一次接觸的人可能會比較懵,反射?什麽反射?怎麽反射?反射是幹嘛的?下面我將在這篇文章中講講Java的反射機制 不過在這之前,還有一個問題需要解決,標題名中的動態性,說起動態性,我先介紹介紹動

java反射機制Class

面向物件思想 一切皆物件 類也是物件,Class類的物件,java.lang.Class Class類的構造器是私有的,只有虛擬機器可以直接建立它的物件, 有三種建立方式:類.class、類物件.getClass、Class.forName 靜態載入:new,發生在編譯的時候 動態載

Java反射機制超詳細

文章目錄 反射機制是什麼 反射機制能做什麼 案例 通過一個物件獲得完整的包名和類名 例項化Class類物件 獲取一個物件的父類與實現的介面 通過反射機制例項化一個類的物件 獲取某個類的全部屬性 獲得某個

Java反射機制Reflection研究及原始碼演示

如下內容內容是關於 Java中反射機制(Reflection)研究及演示的內容。   package com.jiangqq.reflection; import java.lang.reflect.Method; public class Reflection1 { public stati

Java反射機制原始碼反射優勢解析

一、什麼是反射機制          簡單的來說,反射機制指的是程式在執行時能夠獲取自身的資訊。在java中,只要給定類的名字,      那麼就可以通過反射機制來獲得類的所有資訊。  二、哪裡用到反射機制          有些時候,我們用過一些知識,但是並不知道它的專業術語是什麼,在剛剛學jd

深入理解java反射機制

轉載自:https://blog.csdn.net/u012585964/article/details/52011138一,java的核心機制        java有兩種核心機制:java虛擬機器(JavaVirtual Machine)與垃圾收集機制(Garbage c

深入理解java虛擬機器十三 Java 即時編譯器JIT機制以及編譯優化

在部分的商用虛擬機器中,Java 程式最初是通過直譯器( Interpreter )進行解釋執行的,當虛擬機發現某個方法或程式碼塊的執行特別頻繁的時候,就會把這些程式碼認定為“熱點程式碼”。為了提高熱點程式碼的執行效率,在執行時,即時編譯器(Just In Time Com

深入理解JAVA虛擬機器:虛擬機器類載入機制

虛擬機器把描述類的資料從Class檔案載入到記憶體,並對資料進行校驗、轉換解析和初始化,最終形成可以被虛擬機器直接使用的Java型別,這就是虛擬機器的類載入機制。在Java語言裡面,型別的載入、連線和初始化過程都是在程式執行期間完成的。 1、類載入的時機 類從被載入到虛擬機

Deep learning about Java--貫穿Java反射機制1

筆者的mybatis文章暫且先更新到第5篇,因為要繼續深入理解mybatis的機制就不得不返回到我們的Java上,就是日後筆者繼續寫Hibernate的文章也是繞不過Java的反射機制。可以這麼說,筆者認為如果沒有了反射,Java就不會這麼強大! 進入這片文章

對於JAVA反射機制CLASS類的個人理解

上週上課老師點我起來回答問題,問了一下JAVA反射機制,我本來對JAVA用得不多,加上有一段時間沒有看過了,所以並沒有能夠答出來,之後就想要好好理解理解,加上老師佈置作業讓弄懂JAVA反射和Class類,所以CSDN第一次寫部落格,就來寫寫我對反射和Class的學習之後的感