如何获取java.lang.Class实例?
方式一
Class<Person> clazz = Person.class;
方式二
Person person = new Person("Apollo");
Class<? extends Person> clazz = person.getClass();
方式三 (常用)
Class<?> clazz = Class.forName("fun.gosuncn.Person");
方式四
ClassLoader classLoader = ClassLoader.getSystemClassLoader();
Class<?> clazz = classLoader.loadClass("fun.gosuncn.Person");
类的加载过程
加载:将字节码文件加载到内存。
链接:验证、准备、解析。
初始化:执行类构造器<clinit>()
方法的过程。
class A {
static {
a = 100;
}
static int a = 10;
}
在链接
的过程中,a = 0;在初始化
过程中,因为static代码块
在static int a = 10;
前面所以先执行,那么 a = 10;若static代码块
在static int a = 10;
后面,则 a = 100。
类的加载器
BootStrap ClassLoader 引导类加载器。加载java核心类,如String类,由引导类加载器进行加载。
Extension ClassLoader 扩展类加载器。加载jre/lib/ext
目录下的jar包。
System ClassLoader 系统类加载器。加载自定义的类。
也可以自定义类的加载器。
类加载器加载配置文件
public class Test {
public static void main(String[] args) throws Exception {
ClassLoader classLoader = ClassLoader.getSystemClassLoader();
// 默认加载路径是src目录(类路径)
InputStream inputStream = classLoader.getResourceAsStream("jdbc.properties");
Properties properties = new Properties();
properties.load(inputStream);
Object user = properties.get("user");
System.out.println("user = " + user);
}
}
创建运行时类的对象
Class clazz = Person.class;
Object object = clazz.newInstance(); // 使用默认的无参构造函数
使用Class实例的newInstance()方法创建对象:必须满足:必须提供有访问权限的无参构造函数
。
获取运行时类的属性
/**
* 获取运行时类及其父类中声明为public的属性
*/
Field[] fields = clazz.getFields();
/**
* 获取运行时本身类所有属性
*/
Field[] fields = clazz.getDeclaredFields();
/**
* 获取修饰符权限
*/
int modifiers = field.getModifiers();
String modifierString = Modifier.toString(modifiers);
/**
* 获取属性类型
*/
Class<?> type = field.getType();
/**
* 获取属性名
*/
String name = field.getName();
获取运行时类的方法
/**
* 获取运行时类及其父类中声明为public的方法
*/
Method[] methods = clazz.getMethods();
/**
* 获取运行时本身类所有的方法
*/
Method[] methods = clazz.getDeclaredMethods();
/**
* 获取修饰符权限
*/
Modifier.toString(method.getModifiers())
/**
* 获取全部注解
*/
Annotation[] annotations = method.getAnnotations();
/**
* 获取返回值类型
*/
method.getReturnType()
/**
* 获取方法名
*/
method.getName()
获取运行时类的构造方法
/**
* 获取运行时类中声明为public的构造方法
*/
Constructor<?>[] constructors = clazz.getConstructors();
/**
* 获取运行时类中全部构造方法
*/
Constructor<?>[] constructors = clazz.getDeclaredConstructors();
获取运行时类的父类
Class<?> superclass = clazz.getSuperclass();
获取运行时类的带泛型父类
Type type = clazz.getGenericSuperclass();
获取运行时类的带泛型父类的泛型
Type type = clazz.getGenericSuperclass();
ParameterizedType parameterizedType = (ParameterizedType) type;
Type[] types = parameterizedType.getActualTypeArguments();
获取运行时类实现的接口
Class<?>[] interfaces = clazz.getInterfaces();
获取运行时类的包
Package packageX = clazz.getPackage();