16_2.反射相关

通过反射调用类的完整结

  1. 实现的全部接口
    public Class<?>[] getInterfaces()
    确定此对象所表示的类或接口实现的接口。

  2. 所继承的父类
    public Class<? Super T> getSuperclass()
    返回表示此 Class 所表示的实体(类、接口、基本类型)的父类的 Class。

  3. 全部的构造器

  • public Constructor[] getConstructors()
    返回此 Class 对象所表示的类的所有public构造方法。

  • public Constructor[] getDeclaredConstructors()
    返回此 Class 对象表示的类声明的所有构造方法。

  • Constructor类中:

    • 取得修饰符: public int getModifiers();
    • 取得方法名称: public String getName();
    • 取得参数的类型:public Class<?>[] getParameterTypes();

4.全部的方法

  • public Method[] getDeclaredMethods()
    返回此Class对象所表示的类或接口的全部方法
  • public Method[] getMethods()
    返回此Class对象所表示的类或接口的public的方法
   Method run = clazz.getMethod("run");
        System.out.println(run.getReturnType());//void
  • Method类中:
    • public Class<?> getReturnType()取得全部的返回值
    • public Class<?>[] getParameterTypes()取得全部的参数
    • public int getModifiers()取得修饰符
    • public Class<?>[] getExceptionTypes()取得异常信息
  1. 全部的Field
  • public Field[] getFields()
    返回此Class对象所表示的类或接口的public的Field。
  • public Field[] getDeclaredFields()
    返回此Class对象所表示的类或接口的全部Field。
 Field name = clazz.getDeclaredField("name");
  • Field方法中:

    • public int getModifiers() 以整数形式返回此Field的修饰符

    • public Class<?> getType() 得到Field的属性类型

    • public String getName() 返回Field的名称。

  1. Annotation相关(注解)
  • get Annotation(Class annotationClass)
  • getDeclaredAnnotations()
  1. 泛型相关
  • 获取父类泛型类型:Type getGenericSuperclass()
  • 泛型类型:ParameterizedType
  • 获取实际的泛型类型参数数组:getActualTypeArguments()
  1. 类所在的包
    Package getPackage()
package com.test;

import org.junit.Test;

import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.util.Arrays;

import static sun.misc.PostVMInitHook.run;

public class ClassTest {
    @Test
    public void newTest() throws ClassNotFoundException, IllegalAccessException, InstantiationException, NoSuchFieldException, NoSuchMethodException {
        Class clazz = Class.forName("com.test.Person");
        Object person = clazz.newInstance();
        Field name = clazz.getDeclaredField("name");
        name.setAccessible(true);
        name.set(person,"lisi");
        System.out.println(person);
        //哪个类加载器加载
        System.out.println(clazz.getClassLoader());//sun.misc.Launcher$AppClassLoader@70dea4e
        System.out.println(Arrays.toString(clazz.getInterfaces()));//[interface com.test.Per]
        System.out.println(clazz.getSuperclass());//class com.test.PerC
        Method run = clazz.getMethod("run");
        System.out.println(run.getReturnType());//void
    }
}
interface Per{
    void run();
}
class PerC{
    protected String sex;
}
class Person extends PerC implements Per{
    private String name;
    private String sex;

    public Person() {
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getSex() {
        return sex;
    }

    public void setSex(String sex) {
        this.sex = sex;
    }
    @Override
    public void run() {
        System.out.println();
    }
}
原文地址:https://www.cnblogs.com/fly-book/p/11549172.html