本文目录
1 Class类
2 反射
1 Class类
1.1 引用方式
1.1.1 Class引用
Class c1= ClassDemo.class;
Classc2= Class.forName("demo.cla.ClassDemo");
1.1.2 泛化Class引用
通过泛化可以指定类型,只有满足要求的类型,才可以赋值。
Class<ClassDemo> c1 = ClassDemo.class;
Class<? extends ClassDemo> c1 = ClassDemoChild.class;
Class<?> c2 = Class.forName("demo.cla.ClassDemo");
1.1.3 引用方式区别
在使用某个类之前,需要一些准备工作,包含三个步骤:
(1)加载:类加载器查找字节码(.class文件)并从中创建一个Class类的对象。
(2)链接:验证字节码,为静态域分配空间。
(3)初始化:执行静态初始化器或静态初始化块。
通过.class方式获得一个Class对象引用时,不会执行初始化步骤。初始化会被延迟到对静态域进行首次引用时才执行。
通过Class.forName(String className)方式获得一个Class对象引用时,会执行初始化步骤。
实际上,Class.forName另一个重载方法,可以指定是否执行初始化步骤,而Class.forName(String className)也是调用这个重载方法并设置执行初始化步骤。
1.2 常用方法
// 获取一个指定类的Class对象
Class c = Class.forName(String className);
// 获取类的全名(含包名)
c.getTypeName();
// 获取类的类名(不含包名)
c.getSimpleName();
// 判断obj对象是否属性指定类型或其子类型,效果相当于 obj instanceof className
c.isInstance(Object obj);
// 将obj对象强制转化为指定类型
c.cast(Object obj);
// 创建一个指定类的实例对象
c.newInstance();
// 获取所有构造方法
Constructor[] ctors = c.getConstructors();
// 获取符合给定参数列表的构造方法
Constructor ctor = c.getConstructor(Class…);
// 获取所有方法
Method[] methods = c.getMethods();
// 获取符合给定名称和参数列表的方法
Method method = c.getMethod(StringmethodName, Class…);
// 获取所有属性
Fields[] fields = c.getFields();
// 获取指定名称的属性
Field field = c.getField(String fieldName);
2 反射
2.1 Constructor
// 获取符合给定参数列表的构造方法
Constructor ctor= c.getConstructor(int.class, int.class);
// 通过构造方法创建一个对象
Object obj = ctor.newInstance(1,2);
2.2 Method
// 获取符合给定名称和参数列表的方法
Method method = c.getMethod("show", int.class, int.class);
// 通过指定的对象调用当前方法
method.invoke(obj, 1, 2);
2.3 Field
// 获取指定名称的属性
Field field = c.getField("num1");
// 获取指定的对象的属性(不指定类型)
Object valueObj = field.get(obj);
// 获取指定的对象的属性(指定类型)
Object valueInt = field.getInt(obj);
// 设置指定的对象的属性值(不指定类型)
field.set(obj, 100);
// 设置指定的对象的属性值(指定类型)
field.setInt(obj, 200);
1万+

被折叠的 条评论
为什么被折叠?



