鐞嗚Вjava.lang.Class绫

鐞嗚Вjava.lang.Class绫?
Java Class绫荤悊瑙o細

棣栧厛锛孋lass鏄竴涓猨ava绫伙紝璺烰ava API涓畾涔夌殑璇稿Thread銆両nteger绫汇€佹垜浠嚜宸卞畾涔夌殑绫绘槸涓€鏍凤紝涔熺户鎵夸簡Object锛圕lass鏄疧bject鐨勭洿鎺ュ瓙绫伙級銆傛€讳箣锛屽繀椤绘槑纭竴鐐癸紝瀹冨叾瀹炲彧鏄釜绫伙紝鍙笉杩囧悕瀛楁瘮杈冪壒娈娿€傛洿杩涗竴姝ヨ锛孋lass鏄竴涓猨ava涓殑娉涘瀷绫诲瀷銆?



瀵逛簬鎴戜滑鑷繁瀹氫箟鐨勭被锛屾垜浠敤绫绘潵鎶借薄鐜板疄涓殑鏌愪簺浜嬬墿锛屾瘮濡傛垜浠畾涔変竴涓悕绉颁负Car鐨勭被鏉ユ娊璞$幇瀹炵敓娲讳腑鐨勮溅锛岀劧鍚庡彲浠ュ疄渚嬪寲杩欎釜绫伙紝鐢ㄨ繖浜涘疄渚嬫潵琛ㄧず鎴戠殑杞︺€佷綘鐨勮溅銆侀粍鐨勮溅銆佺孩鐨勮溅绛夌瓑銆?

濂戒簡锛岀幇鍦ㄥ洖鍒癈lass 绫讳笂鏉ワ紝杩欎釜绫诲畠鎶借薄浠€涔堜簡锛熷畠鐨勫疄渚嬪張琛ㄧず浠€涔堝憿锛?

鍦ㄤ竴涓繍琛岀殑绋嬪簭涓紝浼氭湁璁稿绫诲拰鎺ュ彛瀛樺湪銆傛垜浠氨鐢–lass杩欎釜鏉ユ潵琛ㄧず瀵硅繖浜涚被鍜屾帴鍙g殑鎶借薄锛岃€孋lass绫荤殑姣忎釜瀹炰緥鍒欎唬琛ㄨ繍琛屼腑鐨勪竴涓被銆備緥濡傦紝杩愯鐨勭▼搴忔湁A銆丅銆丆涓変釜绫伙紝閭d箞Class绫诲氨鏄A銆丅銆丆涓変釜绫荤殑鎶借薄銆傛墍璋撴娊璞★紝灏辨槸鎻愬彇杩欎簺绫荤殑涓€浜涘叡鍚岀壒寰侊紝姣斿璇磋繖浜涚被閮芥湁绫诲悕锛岄兘鏈夊搴旂殑hashcode锛屽彲浠ュ垽鏂被鍨嬪睘浜巆lass銆乮nterface銆乪num杩樻槸annotation銆傝繖浜涘彲浠ュ皝瑁呮垚Class绫荤殑鍩燂紝鍙﹀鍙互瀹氫箟涓€浜涙柟娉曪紝姣斿鑾峰彇鏌愪釜鏂规硶銆佽幏鍙栫被鍨嬪悕绛夌瓑銆傝繖鏍峰氨灏佽浜嗕竴涓〃绀虹被鍨?type)鐨勭被銆?


闇€瑕佹敞鎰忕殑鏄紝杩欎釜鐗规畩鐨凜lass绫绘病鏈夊叕寮€鐨勬瀯閫犲嚱鏁帮紝閭f€庝箞鑾峰彇Class绫荤殑瀹炰緥鍛紵鏈夊嚑涓€斿緞銆?

1.      褰揓ava铏氭嫙鏈鸿浇鍏ヤ竴涓被鐨勬椂鍊欙紝瀹冨氨浼氳嚜鍔ㄥ垱寤轰竴涓狢lass绫荤殑瀹炰緥鏉ヨ〃绀鸿繖涓被銆備緥濡傦紝铏氭嫙鏈鸿浇鍏ar杩欎釜鏉ョ殑鏃跺€欙紝瀹冨氨浼氬垱寤轰竴涓狢lass绫荤殑瀹炰緥銆傜劧鍚庡彲浠ラ€氳繃浠ヤ笅鏂规硶鑾峰緱杩欎釜Class瀵硅薄锛?

java.lang.Class classObj = ClassName.class;

2. 鍙互閫氳繃璋冪敤绫诲姞杞藉櫒锛圕lassLoader锛夌殑defineClass()鏂规硶鏉ュ緱鍒颁竴涓疄渚嬨€傝繖涓柟娉曟帴鍙椾竴涓猙yte鏁扮粍锛岃浇鍏ヨ繖涓猙yte鏁扮粍鍚︽垚鐨刢lass绫伙紝鍚屾椂瀹炰緥鍖栦竴涓狢lass瀵硅薄銆?

3. ClassName.class( )   ClassName.getClass( )

鐜板湪鏉ュ垎鏋愪竴涓婥lass绫荤殑婧愮爜锛坖ava.lang.Class锛夛細

public final

    class Class<T>implementsjava.io.Serializable,

                            java.lang.reflect.GenericDeclaration,

                             java.lang.reflect.Type,

                             java.lang.reflect.AnnotatedElement {鈥?



ClassClass<T>锛屽墠涓€涓狢lass琛ㄧず杩欐槸涓€涓被鐨勫0鏄庯紝绗簩涓狢lass鏄被鐨勫悕绉帮紝<T>琛ㄧず杩欐槸涓€涓硾鍨嬬被锛屽甫鏈夊弬鏁癟.鍚屾椂锛孋lass绫诲疄鐜颁簡璁稿鎺ュ彛銆?



绱ф帴鐫€瀹氫箟浜嗗嚑涓潤鎬佸彉閲忥細

private static final int ANNOTATION= 0x00002000;

private static final int ENUM      = 0x00004000;

private static final int SYNTHETIC = 0x00001000;



鎺ョ潃瀹氫箟涓€涓湰鍦版柟娉時egisterNatives()锛屽苟鍦ㄩ潤鎬佸潡涓皟鐢細

private static native void registerNatives();

    static {

        registerNatives();

}



绉佹湁鐨勬瀯閫犲嚱鏁帮細

private Class() {}

璁块棶淇グ绗︽槸private锛岀▼搴忓憳鏄棤娉曠洿鎺ヨ皟鐢ㄨ繖涓瀯閫犲嚱鏁帮紝鍙兘閫氳繃JVM鏉ヨ皟鐢ㄥ畠锛屾瀯閫犱竴涓狢lass瀹炰緥銆?

  public String toString() {

        return (isInterface() ?"interface " : (isPrimitive() ? "" : "class"))

            + getName();

}

杩欐槸Class瀵硅薄瀹炰緥鐨勫瓧绗︿覆琛ㄧず鏂规硶锛屽簲璇ヤ笉闄岀敓銆傞偅涔堬紝瀹冭繑鍥炰粈涔堜笢瑗垮憿锛?

>濡傛灉杩欎釜Class瀵硅薄瀹炰緥鎵€琛ㄧず鐨勬槸涓€涓狫ava绫伙紝鍒欒繑鍥瀋lass full_classname.

渚嬪java.lang.Math.java杩欎釜绫伙紝瀹冩墍瀵瑰簲鐨凜lass瀹炰緥鐨則oString鏂规硶杩斿洖鐨勫氨鏄痗lass java.lang.Math

>濡傛灉鏄帴鍙o紝灏哻lass鏀规垚interface銆傝繕鏈変竴绉嶇壒娈婃儏鍐碉紝濡傛灉Class瀹炰緥琛ㄧず鐨勬槸void绫诲瀷锛屽垯鍙戞尌void銆傚鏋滄槸鍩烘湰绫诲瀷锛屼竴鏍风殑杩斿洖鍩烘湰绫诲瀷鐨勫悕绉般€?



闈欐€佹柟娉昮orName:

public static Class<?> forName(String className)

                throws ClassNotFoundException{

        returnforName0(className,true, ClassLoader.getCallerClassLoader());

}

鏍规嵁缁欏畾鐨勭被鍚嶅弬鏁癱lassName,鏌ユ壘涓巆lassName鐩稿搴旂殑Class瀹炰緥锛岀劧鍚庡姞杞姐€佽繛鎺ヨ瀹炰緥瀵硅薄锛屼箣鍚庤繑鍥炶繖涓狢lass瀹炰緥銆傚叾涓緥濡備互涓嬩唬鐮佹灏嗚緭鍑猴細

class java.lang.Thread

public class ClassTest {



    /**

     * @param args

     */

    public static void main(String[] args) {

     

       try {

           System.out.println( Class.forName("java.lang.Thread") );

       } catch (ClassNotFoundException e) {

           e.printStackTrace();

           System.out.println("No ClassNamed java.lang.Thread");

       }



    }



}



forName鏂规硶閲嶈浇锛?

    public static Class<?> forName(String name, boolean initialize,

                                   ClassLoaderloader)

        throws ClassNotFoundException

    {

        if (loader ==null) {

            SecurityManager sm = System.getSecurityManager();

            if (sm !=null) {

                ClassLoader ccl = ClassLoader.getCallerClassLoader();

                if (ccl !=null) {

                    sm.checkPermission(

                        SecurityConstants.GET_CLASSLOADER_PERMISSION);

                }

            }

        }

        returnforName0(name, initialize,loader);

    }

娉ㄦ剰鍒拌繖涓猣orName閲嶈浇鏂规硶涓浜嗕袱涓柟娉曞弬鏁帮紝鍏朵腑initialize杩欎釜boolean绫诲瀷鎸囧畾鏄惁瑕佸垵濮嬪寲瀵瑰簲鐨凜lass瀹炰緥锛宭oader鎸囧畾鍔犺浇Class瀹炰緥鐨勫姞杞藉櫒銆傜暀鎰忚繖涓柟娉曞彲鑳芥姏鍑虹殑寮傚父杩樻槸姣旇緝澶氱殑锛屾瘮濡傝繛鎺ュけ璐ャ€佹壘涓嶅埌瀵瑰簲鐨勭被绛夌瓑銆?



forName0鏈湴鏂规硶锛?

private static native Class<?> forName0(String name,boolean initialize,

                                            ClassLoaderloader)

        throws ClassNotFoundException;

杩欐槸涓€涓湰鍦版柟娉曪紝鍦ㄥ墠闈㈢殑闈欐€佹柟娉昮orName鐨勪袱涓増鏈腑閮借皟鐢ㄤ簡杩欎釜鏈湴鏂规硶銆?



newInstance()鏂规硶锛?

public T newInstance()          // T鏄釜娉涘瀷鍙傛暟锛屾槸Class瀹炰緥鎵€琛ㄧず鐨凧ava绫?

        throws InstantiationException,IllegalAccessException

    {

        if (System.getSecurityManager()!=null) {

            checkMemberAccess(Member.PUBLIC, ClassLoader.getCallerClassLoader());

        }

        return newInstance0();     //杩欐槸涓€涓湰鍦版柟娉曪紝涔熷湪Class绫讳腑瀹氫箟

}

娉ㄦ剰杩欐槸涓€涓疄渚嬫柟娉曪紝蹇呴』鐢盋lass绫荤殑瀹炰緥瀵硅薄璋冪敤銆備緥濡傦紝鏈変竴涓唬琛╦ava.lang.Thread绫荤殑Class瀹炰緥瀵硅薄objec1锛屼篃灏辨槸璇达紝娉涘瀷鍙傛暟T姝ゆ椂灏辨槸Thread锛宱bject1杩欎釜瀹炰緥浠h〃Thread杩欎釜绫汇€傚ソ浜嗭紝鐜板湪璋冪敤object1鐨刵ewInstance鏂规硶锛屽嵆object1.newInstance(),姝ゆ椂杩欎釜璋冪敤灏嗚繑鍥炰竴涓猅hread绫荤殑瀵硅薄銆傜畝鍗曢獙璇侊細

public class ForName {



    /**

     * @paramargs

     * @throwsIllegalAccessException

     * @throwsInstantiationException

     */

    public static void main(String[] args) throws InstantiationException, IllegalAccessException {

       Class<?> c = null ;

       try {

           c = Class.forName("java.lang.Thread");

       } catch (ClassNotFoundException e) {

           e.printStackTrace();

       }

       Thread thread = (Thread) c.newInstance(); //绫诲瀷杞寲涓€涓?

       System.out.println(thread.getId());



    }



}

鍦ㄦ垜鏈哄瓙涓紝涓婅堪浠g爜杈撳嚭 8 銆傚嵆c.newInstance浜х敓涓€涓狪D涓?鐨勬柊绾跨▼銆?



getClassLoader:

public ClassLoader getClassLoader() {

        ClassLoader cl = getClassLoader0();

        if (cl ==null)

            return null;   // Bootstrap

        SecurityManager sm = System.getSecurityManager();

        if (sm !=null) {

            ClassLoader ccl = ClassLoader.getCallerClassLoader();

            if (ccl !=null && ccl != cl&& !cl.isAncestor(ccl)) {

               sm.checkPermission(SecurityConstants.GET_CLASSLOADER_PERMISSION);

            }

        }

        return cl;

    }



    //Package-private to allow ClassLoader access

    native ClassLoadergetClassLoader0();   // 鏈湴鏂规硶

杩欎釜鏂规硶杩斿洖璇lass瀵硅薄浠h〃鐨勭被鐨勭被鍔犺浇鍣ㄣ€傚鏋滅被鐨勫姞杞藉櫒鏄疊ootstrap锛屽垯杩斿洖null銆備笅闈㈢殑浠g爜杈撳嚭锛歍he ClassLoader of Thread Class is Bootstrap



Class<?> classObj= Thread.class;

       ClassLoader loader = classObj.getClassLoader();

       if (loader ==null) {

           System.out.println("TheClassLoader of Thread Class is Bootstrap");

       } else {

           System.out.println(loader);

       }



鑾峰彇鐖剁被鏂规硶锛歡etSuperclass()

public native Class<? super T> getSuperclass();

杩欐槸涓€涓湰鍦版柟娉曪紝杩欓噷鐨勯€昏緫鏈夌偣楗讹紝鏂规硶杩斿洖鐨勬槸杩欎釜Class瀵硅薄鎵€浠h〃鐨凧ava绫荤殑鐖剁被瀵瑰簲鐨勭殑Class 瀵硅薄銆?

渚嬪锛?Thread.class.getSuperclass()灏嗚繑鍥炰竴涓唬琛═hread绫荤殑Class瀵硅薄锛孴hread.class.getSuperclass().toString()鍒欒緭鍑鸿繖涓狢lass瀵硅薄鐨勫瓧绗︿覆琛ㄧず锛歝lassjava.lang.Object銆傚叾瀹炶繖閲岀殑鍏崇郴鏃犻潪灏辨槸璇碩hread鐨勮秴绫绘槸Object銆傚彧鏄ザ浜咰lass瀵硅薄杩欎釜寮瓙锛岃嚦浜庤繖涔堢粫鏈変粈涔堝ソ澶勶紝杩樻病鏈夋繁鍒讳綋浼氥€?