Java Class 詳解

       Java程序在運行時,Java運行時系統一直對全部的對象進行所謂的運行時類型標識。這項信息紀錄了每一個對象所屬的類。虛擬機一般使用運行時類型信息選準正確方法去執行,用來保存這些類型信息的類是Class類。Class類封裝一個對象和接口運行時的狀態,當裝載類時,Class類型的對象自動建立。
      Class 沒有公共構造方法。Class 對象是在加載類時由 Java 虛擬機以及經過調用類加載器中的 defineClass 方法自動構造的,所以不能顯式地聲明一個Class對象。 
      虛擬機爲每種類型管理一個獨一無二的Class對象。也就是說,每一個類(型)都有一個Class對象。運行程序時,Java虛擬機(JVM)首先檢查是否所要加載的類對應的Class對象是否已經加載。若是沒有加載,JVM就會根據類名查找.class文件,並將其Class對象載入。(能夠想象,兩個對象role1 和 role2若是都是類Role的實例,role1.getClass() 和 role2.getClass() 獲得的對象是同一個Class對象的引用。
      基本的 Java 類型(boolean、byte、char、short、int、long、float 和 double)和關鍵字 void 也都對應一個 Class 對象。 
      每一個數組屬於被映射爲 Class 對象的一個類,全部具備相同元素類型和維數的數組都共享該 Class 對象。

      通常某個類的Class對象被載入內存,它就用來建立這個類的全部對象。 java


1、如何獲得Class的對象呢?有三種方法能夠的獲取
    一、調用Object類的getClass()方法來獲得Class對象,這也是最多見的產生Class對象的方法。例如:
    MyObject x; spring

    Class c1 = x.getClass(); 數組

     二、使用Class類的中靜態forName()方法得到與字符串對應的Class對象。例如: 
    Class c2=Class.forName("包名 + MyObject")。


    三、獲取Class類型對象的第三個方法很是簡單。若是T是一個Java類型,那麼T.class就表明了匹配的類對象。例如
    Class cl1 = Manager.class;
    Class cl2 = int.class;
    Class cl3 = Double[].class; ui

2、經常使用方法及用法詳解 this

package test.uitls; import java.lang.reflect.Constructor; import javax.persistence.Entity; import org.hibernate.annotations.AccessType; import org.springframework.transaction.annotation.Transactional; import test.model.AbsEntity; import test.model.Role; public class ReflectionUtils { public static void main(String args[]) throws NoSuchMethodException, SecurityException, NoSuchFieldException, InstantiationException, IllegalAccessException, ClassNotFoundException { System.out.println("getName() : " + Role.class.getName());//返回class或interface的包名+類名。 System.out.println("getClassLoader() : " + Role.class.getClassLoader()); System.out.println("getConstructors : " + Role.class.getConstructors());//返回這個類全部的public構造器 System.out.println("getConstructor : " + Role.class.getConstructor());//返回含有某個特定參數類型的public修飾的構造器。 Constructor[] Constructors = Role.class.getDeclaredConstructors();//返回這個類全部由 public, protected, default (package) access, private修飾的構造器。 for (int i = 0; i < Constructors.length; i++) { System.out.println("getDeclaredConstructors " + (i + 1) + " : " + Constructors[i]); } System.out.println("getDeclaredConstructor : " + Role.class.getDeclaredConstructor(String.class));//返回某個含有特定參數類型的public, protected, default //(package) access, private修飾的構造器。 System.out.println("getFields : " + Role.class.getFields().length);//返回全部這個類全部Public修飾屬性, 包括繼承來的屬性. System.out.println("getField : " + Role.class.getField("id"));//返回全部這個類特定名稱public修飾的某個屬性, 包括繼承來的屬性(返回Field類型)。 System.out.println("getDeclaredFields : " + Role.class.getDeclaredFields().length);//返回這個類全部 public, protected, default //(package) access, private修飾的屬性, 但不包括繼承來的屬性。 System.out.println("getDeclaredField : " + Role.class.getDeclaredField("roleName"));//返回這個類含有某個特定名稱的,幷包括由public, protected, default //(package) access, private修飾的屬性。 System.out.println("getMethods : " + Role.class.getMethods().length);//返回全部這個類全部Public修飾屬性, 包括繼承來的方法. System.out.println("getMethod : " + Role.class.getMethod("getId"));//返回全部這個類特定名稱public修飾的某個方法, 包括繼承來的方法(返回Method類型)。 System.out.println("getDeclaredMethods : " + Role.class.getDeclaredMethods().length);//返回這個類全部 public, protected, default //(package) access, private修飾的方法, 但不包括繼承來的方法。 System.out.println("getDeclaredMethod : " + Role.class.getDeclaredMethod("getRoleName"));//返回這個類含有某個特定名稱的,幷包括由public, protected, default //(package) access, private修飾的方法。 System.out.println("getSuperclass : " + Role.class.getSuperclass());//返回父類的Class對象。一個對象只有一個superclass. System.out.println("getSuperclass : " + AbsEntity.class.getSuperclass()); // System.out.println(IEntity.class.getSuperclass());//最上層的接口的超類竟然不是object? System.out.println("getInterfaces : " + Role.class.getInterfaces()[0]);//返回這個類實現的接口。 System.out.println("Role is Interface : " + Role.class.isInterface());//判斷這個Class對象是不是一個接口。 System.out.println("Role is Annotation : " + Role.class.isAnnotation());//判斷這個Class對象是不是一個註釋。 System.out.println("Transactional is Annotation : " + Transactional.class.isAnnotation()); System.out.println("get Role's Entity Annotation : " + Role.class.getAnnotation(Entity.class));//獲取這個類的的註釋Entity,Entity沒有註釋這個類返回null。 System.out.println("get Role's AccessType Annotation : " + Role.class.getAnnotation(AccessType.class)); System.out.println("get Role's Transactional Annotation : " + Role.class.getAnnotation(Transactional.class)); Role myrole = new Role(); System.out.println("Role is Instance Of myrole : " + Role.class.isInstance(myrole));//是不是某個對象的實例。 Class roleClass = Class.forName("test.model.Role"); Role role = (Role)roleClass.newInstance();//這個類必定要有一個默認構造器或public無參構造器。 role.getDisplayString(); } } 



3、結果
getName() : test.model.Role
getClassLoader() : sun.misc.Launcher$AppClassLoader@3feef1eb
getConstructors : [Ljava.lang.reflect.Constructor;@6411c21b
getConstructor : public test.model.Role()
getDeclaredConstructors 1 : public test.model.Role()
getDeclaredConstructors 2 : private test.model.Role(java.lang.String)
getDeclaredConstructor : private test.model.Role(java.lang.String)
getFields : 3
getField : public java.lang.String test.model.AbsEntity.id
getDeclaredFields : 2
getDeclaredField : public java.lang.String test.model.Role.roleName
getMethods : 16
getMethod : public java.lang.String test.model.AbsEntity.getId()
getDeclaredMethods : 5
getDeclaredMethod : public java.lang.String test.model.Role.getRoleName()
getSuperclass : class test.model.AbsEntity
getSuperclass : class java.lang.Object
getInterfaces : interface test.model.IEntity
Role is Interface : false
Role is Annotation : false
Transactional is Annotation : true
get Role's Entity Annotation : @javax.persistence.Entity(name=)
get Role's AccessType Annotation : null
get Role's Transactional Annotation  : null
Role is Instance Of myrole : true
I am a Role



4、用到的接口和類
package test.model;

public interface IEntity {
	public String getDisplayString();
}



package test.model;

import javax.persistence.Column;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;

import org.hibernate.annotations.AccessType;
import org.hibernate.annotations.GenericGenerator;

public abstract class AbsEntity {
	
	@Id
	@GeneratedValue(generator = "system-uuid")
	@GenericGenerator(name = "system-uuid", strategy = "uuid.hex")
	@Column(length = 40)
	@AccessType("property")
	public String id;

	public String getId() {
		return id;
	}

	public void setId(String id) {
		this.id = id;
	}
}



package test.model;

import javax.persistence.Entity;
import javax.persistence.Table;

@Entity
@Table(schema = "public")
public class Role extends AbsEntity implements IEntity{
	public String roleName;
	
	public String userId;

	public Role() {}
	
	private Role(String roleName) {
		this.roleName = roleName;
	}
	public String getRoleName() {
		return roleName;
	}

	public void setRoleName(String roleName) {
		this.roleName = roleName;
	}

	public String getUserId() {
		return userId;
	}

	public void setUserId(String userId) {
		this.userId = userId;
	}

	public String getDisplayString() {
		System.out.println("I am a Role");
		return "Role";
	}
	
}


5、不長用方法 spa

1.isAssignableFrom(class<?> cls) 判斷這個類是不是cls的父類或與cls相同的類。 hibernate

相關文章
相關標籤/搜索