Class类详解

一、Class的定义

Class 类的实例表示 正在运行的 Java 应用程序中的类和接口。枚举是一种类,注解是一种接口。每个数组属于被映射为 Class 对象的一个类,所有具有相同元素类型和维数的数组都共享该 Class 对象。基本的 Java 类型(boolean、byte、char、short、int、long、float 和 double)和关键字 void 也表示为 Class 对象。 

Class 没有公共构造方法。Class 对象是在加载类时由 Java 虚拟机以及通过调用类加载器中的 defineClass 方法自动构造的。 

public final class Class<T> implements java.io.Serializable,
                              GenericDeclaration, //泛型定义
                              Type, //Type 是 Java 编程语言中所有类型的公共高级接口。它们包括原始类型、参数化类型、数组类型、类型变量和基本类型。
                              AnnotatedElement //注解元素, 提供一些注解相关api
							  {

    /*构造函数私有化,只有Java虚拟机才能加载
     * Private constructor. Only the Java Virtual Machine creates Class objects.
     * This constructor is not used and prevents the default constructor being
     * generated.
     */
    private Class(ClassLoader loader) {
        // Initialize final field for classLoader.  The initialization value of non-null
        // prevents future JIT optimizations from assuming this final field is null.
        classLoader = loader;
    }
    private final ClassLoader classLoader;						  
}		

二、获取Class的三种方式

1、类.class

2、对象.getClass()

3、Class.forName("包名.类名")

package reflect;

/**
 * java.lang.Class
 * 
 * @author zhangquanit
 */
public class ClassTest {
	public static void main(String[] args) throws Exception {
		//类.class
		Class<?> clazz=ClassTest.class;
		
		//对象.getClass()
		clazz=new ClassTest().getClass();
		
		//Class.forName(包名.类名)
		clazz=Class.forName("reflect.ClassTest");
       
	}
}

三、API详解

package reflect;

import java.io.InputStream;
import java.lang.reflect.Method;
import java.lang.reflect.Modifier;
import java.lang.reflect.Type;
import java.lang.reflect.TypeVariable;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;


/**
 * java.lang.Class
 * 
 * @author zhangquanit
 */
@MyAnnotation
public class ClassTest {

	public void method(String param) {

	}

	public void method2(String param) {

	}
	
	

	public static class Father implements MyInterface {
		// Father内部类
		public class FatherInnerClass {

		}
	}

	public static class Child<T> extends Father implements MyInterface,MyInterface2<T>{
		// Child内部类
		public class ChildInnerClass {

		}
	}
	
	public static void main(String[] args) throws Exception {

		/*
		 * boolean isInstance(Object obj) 
		 * 判定指定的 Object 是否与此 Class 所表示的对象赋值兼容。
		 */
		ArrayList<String> arrayList = new ArrayList<String>();
		// List是ArrayList的父类
		boolean isInstance = List.class.isInstance(arrayList); // true
		// ArrayList实例
		isInstance = ArrayList.class.isInstance(arrayList); // true
		// ArrayList实现了Collection
		isInstance = Collection.class.isInstance(arrayList); // true

		/*
		 * T cast(Object obj) 
		 * 将一个对象强制转换成此 Class 对象所表示的类或接口。 
		 * 也就是可向父类或实现的接口转型
		 */
		// arrayList转换为List类型,因为List是ArrayList的父类
		List list = List.class.cast(arrayList);
		// arrayList转换为Collection类型,因为ArrayList实现了Collection接口
		Collection collection = Collection.class.cast(arrayList);

		/*
		 * 获取类上的注解(Annotation)、成员变量(Field)、构造方法(Constructor)、方法(Method)
		 * 1、获取当前类所有的 getDeclaredXX 
		 * 2、获取当前类和父类中公有的 getXX
		 */
		Method[] methods = null;
		Method method = null;
		// 当前类和父类中的公有方法
		methods = ClassTest.class.getMethods();
		method = ClassTest.class.getMethod("method", String.class);
		// 当前类中的方法
		methods = ClassTest.class.getDeclaredMethods();
		method = ClassTest.class.getDeclaredMethod("method", String.class);

		/*
		 * Class<?>[] getClasses
		 * 当前类和父类中修饰符为public的内部类、内部接口、内部注解等。
		 */
		Class<?>[] classes = Child.class.getClasses();
		/*
		 * Class<?>[] getDeclaredClasses
		 * 当前类中定义的所有内部类、内部接口、内部注解等。
		 */
		classes = Child.class.getDeclaredClasses();
		
		/*
		 * ClassLoader getClassLoader()
		 * 返回该类的类加载器。
		 */
		ClassLoader classLoader = ClassTest.class.getClassLoader();
		
		/*
		 * Class<?> getComponentType()
		 * 返回表示数组中元素的类型。
		 */
		String[] array=new String[2];
		Class<?> componentType = array.getClass().getComponentType();//class java.lang.String
         
		/*
		 * getEnclosingClass:该类是在那个类中定义的, 比如直接定义的内部类或匿名内部类
		 * getEnclosingConstructor:该类是在哪个构造函数中定义的,比如构造方法中定义的匿名内部类
		 * getEnclosingMethod:该类是在哪个方法中定义的,比如方法中定义的匿名内部类
		 */
		Class<?> enclosingClass = Child.class.getEnclosingClass();//class reflect.ClassTest
		
		/*
		 * T[] getEnumConstants()
		 * 返回枚举类的元素
		 */
		MyEnum[] enumConstants = MyEnum.class.getEnumConstants();//[MAN, WOMAN]
		
		/*
		 * Class<?>[] getInterfaces
		 * 该类实现的所有接口,不包括父类实现的接口
		 */
		Class<?>[] interfaces = Child.class.getInterfaces();
		//[interface reflect.MyInterface, interface reflect.MyInterface2]
		
		/*
		 * Type[] getGenericInterfaces
		 * 该类实现的所有接口Type.不包括父类实现的接口
		 */
		Type[] genericInterfaces = Child.class.getGenericInterfaces();
		//[interface reflect.MyInterface, reflect.MyInterface2<T>]
		
		/*
		 * Class<? super T> getSuperclass
		 * 返回表示此 Class 所表示的实体(类、接口、基本类型或 void)的超类的 Class。
		 */
		Class<? super Child> superclass = Child.class.getSuperclass();
		
		/*
		 * Type getGenericSuperclass
		 * 返回表示此 Class 所表示的实体(类、接口、基本类型或 void)的直接超类的 Type。
		 */
		Type genericSuperclass = Child.class.getGenericSuperclass();
		
		/*
		 * int getModifiers
		 * 返回此类或接口以整数编码的 Java 语言修饰符。
		 */
		int modifiers = ClassTest.class.getModifiers();
		String modify = Modifier.toString(modifiers);//public
		
		/*
		 * Package getPackage
		 * 获取此Class所在的包
		 */
		Package pkg = ClassTest.class.getPackage();
		String packageName=pkg.getName();// reflect
		
		/*
		 * InputStream getResourceAsStream(String name)
		 * 加载指定名称的资源,以'/'开头表示绝对路径,即绝对于src目录
		 */
		InputStream resourceAsStream = ClassTest.class.getResourceAsStream("config/resource.txt");
		// 表示加载 "/reflect/config/resource.txt" 
		
		/*
		 * TypeVariable<Class<T>>[] getTypeParameters
		 * 获取该class上定义的泛型
		 */
		TypeVariable<Class<Child>>[] typeParameters = Child.class.getTypeParameters();
		//  Child类上定义的泛型   T
		
		/*
		 * 类型判断
		 * boolean isAnnotation
		 * 是否为注解
		 * 
		 */
		boolean annotation = MyAnnotation.class.isAnnotation();
		
		/*
		 * boolean isAnonymousClass
		 * 当前类是否为匿名类
		 */
		List<String> innerList=new ArrayList<String>(){
			@Override
			public boolean add(String e) {
				//当前类为匿名类
				boolean anonymousClass = this.getClass().isAnonymousClass();
				return super.add(e);
			}
		};
		innerList.add("1");
		boolean isAnonymousClass=Child.class.isAnonymousClass();//false Child是内部类,不是匿名类
		/*
		 * boolean isArray
		 * 是否为数组
		 */
		boolean isArray = String[].class.isArray(); //true
		/*
		 * boolean isAssignableFrom(Class<?> cls)
		 * ClassA表示的类或接口是否为参数ClassB的父类或父接口
		 */
		boolean assignableFrom = Father.class.isAssignableFrom(Child.class); //true
		/*
		 * boolean isEnum
		 * 是否为枚举
		 */
		boolean isEnum = MyEnum.class.isEnum(); //true
		
		/*
		 * boolean isInterface
		 * 是否为接口
		 */
		boolean isInterface = MyInterface.class.isInterface();//true
		
		/*
		 * boolean isMemberClass
		 * 是否为成员类,即内部类
		 */
		boolean isMemberClass = Father.class.isMemberClass();//true
		
		/*
		 * boolean isPrimitive
		 * 是否为基本数据类型
		 */
		 boolean isPrimitive = int.class.isPrimitive(); //true
		 
		 /*
		  * T newInstance
		  *  创建此 Class 对象所表示的类的一个新实例。注意,该类中必须有无参的构造函数
		  */
		 ClassTest classTest = ClassTest.class.newInstance();
		
	}
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值