Java反射机制Class类有哪些常用方法

Java面试题参考答案

1.  Class类的常用方法(17)

  • Class.forName();动态加载类。
  • newInstance() :根据对象的class新建一个对象
  • getSuperclass() 获取继承的父类
  • getInterfaces() 获取继承的接口
  • getDeclaredFields() 获取字段名字
  • getDeclaredMethods();获取当前类的所有方法。
  • getConstructors() :获得所有的构造函数。
  • getModifiers() : 反射中获得修饰符
  • getPackage() :反射中获得package
  • getField(String name):反射中获得域成员。
  • getFields() :获得域数组成员。
  • isAnnotation() :判断是否为注解类型。
  • isPrimitive() :判断是否为基本类型。
  • isArray() :判断是否为数组类型。
  • isEnum() :判断是否为枚举类型。
  • getClassLoader() :获得类的类加载器
  • getMethods() 获得公共的方法。

2.  实例

根据反射获取类的信息:

/**
 * 获取类对象
 */
public Class<?> getClassName(String className)throws Exception {
    return Class.forName(className);
}

/**

 * 实例化对象
 */

public Object createClass(Class<?> clazz)throws  Exception {
    return clazz.newInstance();
}

/**
 * 获取当前类的父类
 */

public Class<?> getParentClass(Class<?> clazz)throws  Exception  {
    return clazz.getSuperclass();
}

/**
 * 获取当前类的所有父类
 */
public List<Class<?>> getAllParentClass(Class<?> clazz) {
    List<Class<?>> listClass = new ArrayList<Class<?>>();
    for(Class<?> parentClass=clazz;parentClass.getSuperclass()!=null;parentClass=parentClass.getSuperclass()){
        listClass.add(parentClass);
    }
    return listClass;
}

/**
 * 获取当前类实现的接口
 */

public List<Class<?>> getInterfaces(Class<?> clazz) {
    return Arrays.asList(clazz.getInterfaces());
}

/**
 * 获取当前类和父类还有接口继承的所有实现的接口
 */

public HashSet<Class<?>> getAllInterfaces(Class<?> clasz) {
    HashSet<Class<?>> listClass = new HashSet<Class<?>>();
    for(Class<?> parentClass=clasz;parentClass.getSuperclass()!=null;parentClass=parentClass.getSuperclass()){
        getInterface(parentClass,listClass);
    }
    return listClass;
}

public void getInterface(Class<?> clasz,HashSet<Class<?>> listClass){
    for (Class<?> aClass : clasz.getInterfaces()) {
        listClass.add(aClass);
        if(aClass.getInterfaces()!=null){
            getInterface(aClass,listClass);
        }
    }
}
/**
 * 获取当前类的方法
 */
public List<Method> getMethod(Class<?> clazz) {
    return Arrays.asList(clazz.getDeclaredMethods());
}

/**
 * 获取当前类和父类的方法
 */
public List<Method> getAllMethod(Class<?> clazz) {
    List<Method> listMethod = new ArrayList<Method>();
    for(Class<?> parentClass=clazz;parentClass.getSuperclass()!=null;parentClass=parentClass.getSuperclass()){
        listMethod.addAll(Arrays.asList(parentClass.getDeclaredMethods()));
    }
    return listMethod;
}

/**
 * 获取当前类的属性
 */
public List<Field> getField(Class<?> clazz) {
    return Arrays.asList(clazz.getDeclaredFields());
}

/**
 * 获取当前类和父类的所有属性
 */
public List<Field> getAllField(Class<?> clazz) {
    List<Field> listField = new ArrayList<Field>();
    for(Class<?> parentClass=clazz;parentClass.getSuperclass()!=null;parentClass=parentClass.getSuperclass()){
        listField.addAll(Arrays.asList(parentClass.getDeclaredFields()));
    }
    return listField;
}

测试类的代码:

public static void main(String[] args) throws Exception {

    // System.out.println(new ClassA().getClass().getName());
    // System.out.println(ClassA.class.getName());
    InfoClass i = new InfoClass();

    Class<?> clazz = i.getClassName("test1.ClassA");
    System.out.println("获得类对象:" + clazz.getName()+"\t\t"+clazz);
    Object obj = i.createClass(ClassA.class);
    System.out.println("获得类的实例"+obj.getClass().getName()+"\t\t"+obj);
    System.out.println("获得类的父类"+i.getParentClass(ClassA.class));
    show("获取当前类的所有父类:",i.getAllParentClass(ClassA.class));
    show("获取当前类实现的接口:",i.getInterfaces(ClassA.class));
    show("获取当前类和父类还有接口继承的所有实现的接口:",i.getAllInterfaces(ClassA.class));
    show("获取当前类的方法",i.getMethod(ClassA.class));
    show("获取当前类和父类的方法",i.getAllMethod(ClassA.class));
    show("获取当前类的属性",i.getField(ClassA.class));
    show("获取当前类和父类的所有属性",i.getAllField(ClassA.class));
}


public static void show(String name,Object obj){
    System.out.print(name);
    if(obj instanceof Collection){
        for(Object o:((Collection)obj)){
            System.out.print("\t");
            System.out.print(o);
        }
    }
    System.out.println();
}

结果:

Java反射机制Class类有哪些常用方法

以上,是Java面试题【Java反射机制Class类有哪些常用方法】的参考答案。

 

输出,是最好的学习方法。

立即行动,在评论区记录下你的问题、笔记或补充~

—end—

0 条回复 A文章作者 M管理员
    暂无讨论,说说你的看法吧