JAVA-反射-Class类
类 Class <T>
- API : T - 由此 Class 对象建模的类的类型。例如, String.class 的类型是 Class<String>。如果将被建模的类未知,则使用 Class<?>。
- Class类是一个字节码对象类
- 它是一个类,存在于java.lang包中,它的构造函数是私有的,由JVM(类加载器)创建Class对象,我们可以通过getClass()方法获取到Class对象但是不能显式声明对象。
- Class对象,通过它我们可以拿到创建的类的属性,方法等。
Class类的加载、连接和初始化
- 类加载器:负责将.class文件加载到内存中,并为之生成对应的Class对象
- 每个类在运行时都会产生class字节码文件对象,class字节码文件对象内存中只有一个,不管获取几次也不管以何种方式在哪里获取
方法
返回值类型 | 方法 | 说明 |
---|---|---|
static Class<?> |
forName(String className) |
返回与带有给定字符串名的类或接口相关联的 Class 对象 |
Constructor<T> |
getConstructor(Class<?>... parameterTypes) |
返回一个 Constructor 对象,它反映此Class 对象所表示的类的指定公共构造方法 |
Constructor<?>[] |
getConstructors() |
返回一个包含某些 Constructor 对象的数组,这些对象反映此 Class 对象所表示的类的所有公共构造方法 |
Constructor<T> |
getDeclaredConstructor(Class<?>... parameterTypes) |
返回一个 Constructor 对象,该对象反映此 Class 对象所表示的类或接口的指定构造方法 |
Constructor<?>[] |
getDeclaredConstructors() |
返回 Constructor 对象的一个数组,这些对象反映此 Class 对象表示的类声明的所有构造方法 |
T |
newInstance() |
创建此 Class 对象所表示的类的一个新实例 |
Field |
getDeclaredField(String name) |
返回一个 Field 对象,该对象反映此 Class 对象所表示的类或接口的指定已声明字段 |
Field[] |
getDeclaredFields() |
返回 Field 对象的一个数组,这些对象反映此 Class 对象所表示的类或接口所声明的所有字段 |
Field |
getField(String name) |
返回一个 Field 对象,它反映此 Class 对象所表示的类或接口的指定公共成员字段 |
Field[] |
getFields() |
返回一个包含某些 Field 对象的数组,这些对象反映此 Class 对象所表示的类或接口的所有可访问公共字段 |
Method |
getDeclaredMethod(String name, Class<?>... parameterTypes) |
返回一个 Method 对象,该对象反映此 Class 对象所表示的类或接口的指定已声明方法 |
Method[] |
getDeclaredMethods() |
返回 Method 对象的一个数组,这些对象反映此 Class 对象表示的类或接口声明的所有方法,包括公共、保护、默认(包)访问和私有方法,但不包括继承的方法 |
Method |
getMethod(String name, Class<?>... parameterTypes) |
返回一个 Method 对象,它反映此 Class 对象所表示的类或接口的指定公共成员方法 |
Method[] |
getMethods() |
返回一个包含某些 Method 对象的数组,这些对象反映此 Class 对象所表示的类或接口(包括那些由该类或接口声明的以及从超类和超接口继承的那些的类或接口)的公共 member 方法 |
三种获取Class字节码对象的方式
// 1.调用Object类的getCalss()方法
Class class1 = new Person().getClass();
System.out.println(class1);
/*静态代码块
公共空参
class com.oracle.demo01.Person*/
// 2.调用Class的静态属性.class
Class class2 = Person.class;
System.out.println(class2);
/*class com.oracle.demo01.Person*/
// 3.调用Class类的静态方法forName(完整的包名类名)
Class class3 = Class.forName("com.oracle.demo01.Person");
System.out.println(class3);
/*class com.oracle.demo01.Person*/
Person类
package com.oracle.demo01;
public class Person {
public String name;
private int age;
public Person() {
System.out.println("公共空参");
}
public Person(String name){
System.out.println("public Person(String name)");
}
@SuppressWarnings("unused")
private Person(String name, int age){
System.out.println("private Perosn(String name, int age)");
}
static {
System.out.println("静态代码块");
}
public void eat() {
System.out.println("public void eat()");
}
public void sleep(){
System.out.println("public void sleep()");
}
public void smoke(){
System.out.println("public void smoke()");
}
@Override
public String toString() {
return "Person [name=" + name + ", age=" + age + "]";
}
}