反射是指程序可以访问,检测和修改它本身状态或行为的一种能力.
一.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