1.反射查看类信息


反射是指程序可以访问,检测和修改它本身状态或行为的一种能力.

一.Class类和Class类实例

Class类和Class类实例

  • Class类的实例表示正在运行的Java程序中的类和接口.
    类的声明为:public final class Class extends Object implements Serializable,GenericDeclaration,Type,AnnotatedElement

  • 泛型T:表示此Class对象建模的类的类型,例如,String.class的类型是Class.
    如果表示的类未知,则使用Class<?>或Class.

得到Class类的实例的3种方式

  • forName(String className)静态方法,className表示全限定名.如String的全限定名:java.lang.String.
  • 调用某个类的class属性获取class对象,如Data.class会返回Data类对应的Class对象(其实就是得到一个类的一份字节码文件).
  • 调用某个对象的getClass()方法,该方法属于Object类,Class<?> clz = new Date().getClass()

新建类ClassDemo

//获取Class类的实例的3种方法
public class ClassDemo {
	public static void main(String[] args) throws ClassNotFoundException {
		Class<Date> clz1 = Date.class;
		//需要抛出ClassNotFoundException,字节码文件找不到
		Class<Date> clz2 = (Class<Date>)Class.forName("java.util.Date");
		Class<Date> clz3 = (Class<Date>)new Date().getClass(); 
	}

}

二. 九个预定义Class对象

  • 基本的Java类型(boolean,byte,char,short,int,long,float,double)和关键字void通过class属性也表示为Class对象;

  • Class类中boolean isPrimitive()方法用于判定指定的Class对象是否是基本类型.

  • 包装类和Void类的静态TYPE字段表示其基本类型的字节码对象.

  • 数组的维度和数组的类型都相同时才表示同一种数组类型.

新建类ClassDemo1

//Class对象的判断
public class ClassDemo1 {
	public static void main(String[] args) {
		boolean ret = Integer.TYPE == int.class;//true
		System.out.println(ret);

		ret = Integer.class == int.class;//false
		System.out.println(ret);

		Class<String[]> clz = String[].class;
		int[] arr1 = new int[] { 1, 2, 3 };
		ret = arr1.getClass() == int[].class;//true
		System.out.println(ret);

		ret = int.class.isPrimitive();//true
		System.out.println(ret);

		ret = Integer.class.isPrimitive();//false
		System.out.println(ret);

	}

}

三. 获取类中构造器

  • Constructor getConstructor(Class<?>…parameterTypes):返回该Class对象表示类的指定的public构造器.

  • Constructor<?> getConstructor():返回该Class对象表示类的所有public构造器.

  • Constructor getDeclaredConstructor(Class<?>… parameterTypes):返回该Class对象表示类的指定的构造器,和访问权限无关.

  • Constructor<?>[] getDeclaredConstructors():返回该Class对象表示类的所有构造方法,和访问权限无关.

四. 获得类中的方法

  • Method getMethod(String name,Class<?>… - parameterTypes):返回该Class对象表示类和其父类的指定的public方法.

  • Method[] getDeclaredMethod(String name,Class<?>… parameterTypes):返回该Class对象表示类中的指定的方法,和访问权限无关,但不包括继承的方法.

  • Method[] getDeclaredMethods():返回该Class对象表示类中所有的方法,但不包括继承来的方法

五. 获得类中字段

  • Field getField(String name):返回该Class对象表示类和其父类的指定的public字段

  • Field[] getFields(): 返回Class对象表示类和其父类中的所有public字段

  • Field getDeclaredField(String name):返回该Class对象表示类的指定的字段,和访问权限无关,但不包括继承的字段

  • Field[] getDeclaredFields():返回当前Class对象表示类中所有字段,但不包括继承来的字段

六. 其他常用方法

  • public boolean isArray():判断该Class对象是否表示数组类型
  • public boolean isEnum():判断该Class对象是否是枚举类型
  • public boolean isInterface():判断Class对象是否是接口类型
  • public boolean isInstance(Object obj):判断obj是否是该Class对象所表示类的实例.等价于instanceof;
  • public Class<? super T> getSuperclass():返回该Class对象所表示类型(类,接口,基本类型或void)的超类的Class
发布了82 篇原创文章 · 获赞 0 · 访问量 1328

猜你喜欢

转载自blog.csdn.net/huang_kuh/article/details/105490783