1、Class类对象
java中万物皆对象,除了平时用的类实例化的对象,还有类本身也是一种对象。class类包含了与类有关的信息。Class对象是在类加载的时候由JVM以及调用类加载器构造的。
类的加载过程:加载→链接(验证→准备→解析)→初始化
加载:
读二进制文件,存到方法区中,创建类对象
链接:
验证
验证二进制文件格式是否正确
准备
解析
初始化数据
初始化:
构建一个默认对象
Student student = new Student();
Class<?> clazz1 = student.getClass();
System.out.println(clazz1);
Class<?> clazz2 =Student.class;
System.out.println(clazz2==clazz1);
Class<?> clazz3 = Class.forName("com.qf.cdjava2201.day25.Student");
System.out.println(clazz3==clazz1);
无论哪种方式获取到的对象是一样的
推荐使用第三种
2、构造函数
反射操作构造函数
Class clazz = Class.forName("com.qf.cdjava2201.day25.Student");
//操作构造函数--所有的构造
// Constructor[] cs = clazz.getConstructors();
// for (Constructor constructor : cs) {
// System.out.println(constructor);
// }
//获取指定的构造函数
//Constructor c = clazz.getConstructor();//只取public
Constructor c = clazz.getDeclaredConstructors();//所有这个类中定义的构造
//System.out.println(c);
//创建对象
c.setAccessible(true);//打开对私有的访问权限
Object stu = c.newInstance();
System.out.println(stu);
//使用反射调用带参构造创建一个学生
//获取泛型的实际参数
Class<?> clazz = Class.forName("com.qf.cdjava2201.day25.Student");
Constructor<?>[] dcs = clazz.getDeclaredConstructors();
for (Constructor<?> c : dcs) {
Type[] gpts = c.getGenericParameterTypes(); //获取形参
for (Type gpt :gpts) {
if(gpt instanceof ParameterizedType) {//判断是否是形式参数
ParameterizedType t = (ParameterizedType) gpt; System.out.println(Arrays.toString(t.getActualTypeArguments()));
}
}
//System.out.println(Arrays.toString(gpts));
//System.out.println(Arrays.toString(c.getParameterTypes()));
//System.out.println(Arrays.toString(c.getParameters()));
//System.out.println(c.getParameterCount());//参数数量
//System.out.println(c.getName());
//获取访问修饰符
// int m = c.getModifiers();
// System.out.println(m);
}
3、分析方法
访问修饰符 返回值类型 方法名(参数列表){
}
clazz.getMethods()://获取到所有public的方法,包括继承的
clazz.getDeclaredMethods()://获取自己类中所有的方法,包括私有的
clazz.getMethod(Class ... parameterTypes)
clazz.getDeclaredMethod(Class ... parameterTypes)
public static void main(String[] args) {
try {
Class<?> clazz = Class.forName("com.qf.cdjava2201.day25.Student");
//获取方法
//Method[] ms = clazz.getMethods();
//System.out.println(Arrays.toString(ms));
Method add = clazz.getDeclaredMethod("add", int.class,int.class);
//调用方法
//设置访问权限
add.setAccessible(true);
System.out.println(add.getReturnType());
//调用
int result = (int) add.invoke(clazz.newInstance(), 10,20);
System.out.println(result);
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (NoSuchMethodException e) {
e.printStackTrace();
} catch (SecurityException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (IllegalArgumentException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
} catch (InstantiationException e) {
e.printStackTrace();
}
}
4、分析属性
public static final String name = "张三丰";
public static void main(String[] args) throws Exception {
Class<?> clazz = Class.forName("com.qf.cdjava2201.day25.Student");
Field f = clazz.getDeclaredField("age");
f.setAccessible(true);
Student s1 = (Student) clazz.newInstance();
f.set(s1, 20);
System.out.println(f.get(s1));
System.out.println(f.getName());
System.out.println(f.getType());
}