通常某個類的Class對象被載入內存,它就用來建立這個類的全部對象。 java
1、如何獲得Class的對象呢?有三種方法能夠的獲取
一、調用Object類的getClass()方法來獲得Class對象,這也是最多見的產生Class對象的方法。例如:
MyObject x; spring
Class c1 = x.getClass(); 數組
二、使用Class類的中靜態forName()方法得到與字符串對應的Class對象。例如:
三、獲取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(); } }
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
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