java Class 类与反射机制
2019-03-08 本文已影响0人
王古
java.lang.Class
Class 类的构造方法是私有的,只有 Java 虚拟机可以创建该类的对象,因此我们无法在代码中显式地声明一个 Class 对象。
private Class(ClassLoader loader) {
classLoader = loader;
}
构造方法私有,类只能通过以下方法得到 Class 类对象
class AClass{}
AClass aClass1 = new AClass();
通过类的静态成员表示。每个类都有一个隐含的静态成员clas
Class c1 = AClass.class;
通过类对象的 getClass() 方法
Class c2 = AClass1.getClass();
通过 Class 类的静态方法 forName() 方法获取 Class 的对象。
mClass = Class.forName("custom.OtherClass");
Class 类的对象得到类的对象
newInstance() 调用 MyClass 类的无参构造方法。如果 MyClass 类中存在显示的有参构造方法,会覆盖默认的无参构造方法,同时又没有显示的声明无参构造方法,那么执行这段代码时会直接导致程序Crash掉。
AClass aClass2 = (AClass) c2.newInstance();
反射
反射就是加载类,并解剖出类的各个组成部分
- 在运行时判断任意一个对象所属的类;
- 在运行时构造任意一个类的对象;
- 在运行时判断任意一个类所具有的成员变量和方法;
- 在运行时调用任意一个对象的方法;
- 生成动态代理。
反射机制的类
java.lang.Class;
java.lang.reflect.Constructor;
java.lang.reflect.Field;
java.lang.reflect.Method;
java.lang.reflect.Modifier;
Class类的实例化
package net.xsoftlab.baike;
public class TestReflect {
public static void main(String[] args) throws Exception {
Class<?> class1 = null;
Class<?> class2 = null;
Class<?> class3 = null;
// 一般采用这种形式
class1 = Class.forName("net.xsoftlab.baike.TestReflect");
class2 = new TestReflect().getClass();
class3 = TestReflect.class;
}
}
获取对象的父类与接口
Class<?> clazz = Class.forName("net.xsoftlab.baike.TestReflect");
// 取得父类
Class<?> parentClass = clazz.getSuperclass();
// 获取所有的接口,使用数组存储
Class<?> intes[] = clazz.getInterfaces();
获取全部构造函数
Constructor<?> cons[] = class1.getConstructors();
获取类的全部方法
Class<?> clazz = Class.forName("net.xsoftlab.baike.TestReflect");
Method method[] = clazz.getMethods();