首页 > 代码库 > java.lang.Class<T> -- 反射机制

java.lang.Class<T> -- 反射机制

1反射机制是什么

反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。

2反射机制能做什么

反射机制主要提供了以下功能: 

  • 在运行时判断任意一个对象所属的类;

  • 在运行时构造任意一个类的对象;

  • 在运行时判断任意一个类所具有的成员变量和方法;

  • 在运行时调用任意一个对象的方法;

  • 生成动态代理。

3反射机制的相关API

通过一个对象获得完整的包名和类名

package edu.pri.lime.test;

public class TestReflect {

    public static void main(String[] args){
        TestReflect reflect = new TestReflect();
//        通过一个对象获得完整的包名和类名
        System.out.println(reflect.getClass().getName());
    }
}

实例化Class类对象

package edu.pri.lime.test;

public class TestReflect {

    public static void main(String[] args) throws ClassNotFoundException{
        
        Class<?> clazzA = Class.forName("edu.pri.lime.test.TestReflect");
        Class<?> clazzB = new TestReflect().getClass();
        Class<?> clazzC = TestReflect.class;
        
        System.out.println(clazzA.getName());
        System.out.println(clazzB.getName());
        System.out.println(clazzC.getName());
    }
}

获取一个对象的父类与实现的接口

package edu.pri.lime.test;

import java.io.Serializable;

public class TestReflect implements Serializable{

    private static final long serialVersionUID = -3407476067923921222L;

    public static void main(String[] args) throws ClassNotFoundException{
        
        Class<?> clazz = Class.forName("edu.pri.lime.test.TestReflect");
//        获取父类
        Class<?> clazzSup = clazz.getSuperclass();
        System.out.println(clazzSup.getName());
        
//        获取所有接口
        Class<?> clazzInte[] = clazz.getInterfaces();
        for(Class<?> in : clazzInte){
            System.out.println(in.getName());
        }
    }
}

获取某个类中的全部构造函数

package edu.pri.lime.test;

import java.io.Serializable;
import java.lang.reflect.Constructor;
import java.lang.reflect.Modifier;

public class TestReflect implements Serializable{
    private static final long serialVersionUID = -3407476067923921222L;

    private int id;
    private String name;

    public TestReflect() {
        super();
        // TODO Auto-generated constructor stub
    }

    public TestReflect(int id) {
        super();
        this.id = id;
    }

    public TestReflect(String name) {
        super();
        this.name = name;
    }

    public TestReflect(int id, String name) {
        super();
        this.id = id;
        this.name = name;
    }

    public static void main(String[] args) throws ClassNotFoundException{
        
        Class<?> clazz = Class.forName("edu.pri.lime.test.TestReflect");
//        获取所有构造函数
        Constructor<?>[] constructors = clazz.getConstructors();
        for(Constructor<?> con : constructors){
//            获取构造函数所有参数类型
            Class<?>[] paramTypes = con.getParameterTypes();
            System.out.print(Modifier.toString(con.getModifiers()) + " ");
            System.out.print(con.getName() + "(");
            for(int i = 0;i < paramTypes.length;i++){
                if(i < paramTypes.length - 1){
                    System.out.print(paramTypes[i].getName().substring(paramTypes[i].getName().lastIndexOf(".") + 1) + ",");
                }else{
                    System.out.print(paramTypes[i].getName().substring(paramTypes[i].getName().lastIndexOf(".") + 1));
                }
            }
            System.out.println(");");
        }
    }
}

通过反射机制实例化一个类的对象

java.lang.Class<T> -- 反射机制