1. 程式人生 > >java反射機制學習:初始反射機制

java反射機制學習:初始反射機制

pro sta 加載 初始 完整 tac demo 獲得 sys

  本人小白一枚,想和大家一起分享我學習java的筆記和心得。

反射機制:
指的是可以於運行時加載、探知、使用編譯期間完全未知的類。
程序在運行狀態中,可以動態加載一個只有名稱的類,對於任意一個已加載的類,都能夠知道這個類的所有屬性和方法;對於任意一個對象,都能夠調用它的任意一個方法和屬性;

Class clazz = Class.forName(com.danchel.reflect.User);
加載完類之後,在堆內存中,就產生了一個Class類型的對象(一個類只有一個Class對象),這個對象就包含了完整的類的結構信息。
我們可以通過這個對象看到類的結構。這個對象就像一面鏡子,透過這個鏡子看到類的結構,所以,我們形象的稱為:反射。

Class類是Reflection的根源。
針對任何你想動態加載、運行的類,唯有先獲得相應的Class對象。

Class類的對象如何獲取?
1、運用getClass();
2、運用Class.forName();
3、運用.class語法。

對象是用來表示和封裝一些數據。一個類被加載後,JVM會創建一個對應該類的Class對象,類的整個結構信息會放到對應的Class對象中。
這個Class對象就像一面鏡子一樣,通過這面鏡子我可以看到對應類的全部信息。
反射機制的核心就是此處的Class對象。

註意:同一個類,只會被加載一次(hashcode的值相同)。
Class clazz1=Class.forName(com.danchel.reflect.User);
System.out.println(clazz.hashCode());
Class clazz2=Class.forName(com.danchel.reflect.User);
System.println(clazz2.hashCode());

應用反射的API,獲取類的信息(名字,屬性,方法,構造器等)
//獲取類的名字
System.out.println(clazz.getName()); //獲取包括包名的類的名字
System.out.println(clazz.getSingleName()); //只獲取類的名字,不包括包名

package com.danchel.reflect;

import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;

public class Demo02 {
public static void main(String[] args) {
String path = "com.danchel.reflect.User";

try {
Class clazz =Class.forName(path);

System.out.println(clazz.getName());//獲取類的名字,包括包名
System.out.println(clazz.getSimpleName()); //只獲取類的名字,不包括包的名字

Field[] fields2 =clazz.getFields(); //獲得所有的訪問權限為public的屬性,訪問權限為protected,default,private的屬性不能獲取
Field[] fields=clazz.getDeclaredFields();//獲得所有的屬性,不受訪問權限限制
Field field =clazz.getDeclaredField("name");//獲得單個屬性,不受訪問權限限制,參數是該對象要獲取的屬性名的字符串形式
System.out.println(field);
for(Field f:fields){
System.out.println("屬性:"+f);
}

clazz.getMethods();//獲得所有的訪問權限為public的方法
Method[] methods =clazz.getDeclaredMethods();
Method method=clazz.getDeclaredMethod("setName", String.class);//獲得單個方法,第一個參數是該對象要獲取的方法名的字符串形式,第二個參數是該方法需要傳進來的參數的類型.class
for(Method temp:methods){
System.out.println("方法:"+temp);
}

Constructor[] constructors=clazz.getDeclaredConstructors();
Constructor c = clazz.getDeclaredConstructor(String.class,String.class,int.class);//獲得某一個構造器,參數是構造器需要傳進來的參數的類型.class
System.out.println(c);
for (Constructor constructor : constructors) {
System.out.println("構造器:"+constructor);
}

} catch (Exception e) {
e.printStackTrace();
}
}
}

java反射機制學習:初始反射機制