Java反射机制

Java反射机制_第1张图片

文章目录

    • 1、什么是反射机制
    • 2、获取Class对象
    • 3、反射获取类,属性,方法,构造器
    • 4、反射机制操作构造器,方法,属性,泛型,注解

1、什么是反射机制

指的程序在运行状态中,可以动态加载一个只有名称的类,对于任意一个 已加载的类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性。 一个类被加载后,JVM会创建一个对应该类的Class对象,类的整个结构信息会放到对应的Class对象中,这个Class对象就像一面镜子一样,通过这面镜子我可以看到对应类的全部信息,所以,我们形象的称之为:反射。

2、获取Class对象

获取Class对象的方式

代码实现

/**
 * 获取Class 对象
 */
public class ClassDemo {
    public static void main(String[] args) throws ClassNotFoundException {
        //第一种方式
        Class clazz = Class.forName("java.lang.String");
        //第二种方式
        Class clazz1 = String.class;
        //第三种方式
        String str = new String();
        Class clazz2 = str.getClass();

        System.out.println("方式一:" + clazz + "方式二:" + clazz1 + "方式三:" + clazz2);

        System.out.println(clazz);
    }
}

3、反射获取类,属性,方法,构造器

代码实现

/**
 * 反射获取类,属性,方法,构造器
 */
public class ReflectDemo {

    public static void main(String[] args) throws Exception {
        //获取类的名字
        Class clazz = Class.forName("reflect.User");
        System.out.println(clazz.getName());
        System.out.println(clazz.getSimpleName());
        //属性
        //Field[] field1=clazz.getFields();  //类中公共的属性
        Field[] fields= clazz.getDeclaredFields(); //类中所有的属性
        for (Field temp:fields){
            System.out.println(temp);
        }
        Field fieldUserName=clazz.getDeclaredField("username");
        System.out.println("UserName属性:"+fieldUserName);
        //方法
        Method []  methods= clazz.getDeclaredMethods();
        for (Method temp:methods){
            System.out.println(temp);
        }
        Method userNameMethod=clazz.getDeclaredMethod("getUsername",null);
        System.out.println("getUsername方法:"+userNameMethod);
        Method setMethode= clazz.getDeclaredMethod("setUsername",String.class);
        System.out.println("setUsernamef方法:\r\n"+setMethode);
        //构造器
        Constructor[] constructors = clazz.getDeclaredConstructors();
        for(Constructor temp:constructors){
            System.out.println(temp);
        }
        Constructor c = clazz.getDeclaredConstructor(String.class,String.class);
        System.out.println("c构造器:\r\n"+c);


    }
}

4、反射机制操作构造器,方法,属性,泛型,注解

代码实现 操作构造器,方法,属性

/**
 * 反射机制操作构造器,方法,属性,泛型,注解
 */
public class reflectReadDemo {
    public static void main(String[] args) throws Exception {
        //构造器
        Class clazz = Class.forName("reflect.User");
        User u = (User) clazz.newInstance();
        System.out.println(u);
        Constructor constructor = clazz.getDeclaredConstructor(String.class, String.class);
        User u1 = constructor.newInstance("ad", "nn");
        System.out.println(u1.getPassword() + u1.getUsername());
        //方法
        User u3 = (User) clazz.newInstance();
        Method method = clazz.getDeclaredMethod("setUsername", String.class);
        method.invoke(u3, "你好");
        System.out.println(u3.getUsername());
        //属性
        User u4 = (User) clazz.newInstance();
        Field field = clazz.getDeclaredField("username");
        field.setAccessible(true);
        field.set(u4, "ada");
        System.out.println(u4.getUsername());
    }
}

代码实现操作泛型

/**
 * 反射操作泛型
 */
public class czFxDemo {

    public void test01(Map map, List list) {

    }

    public Map test02() {
        return null;
    }

    public static void main(String[] args) throws Exception {
        //获得指定方法参数泛型信息
        Method method = czFxDemo.class.getMethod("test01", Map.class, List.class);
        Type[] types = method.getGenericParameterTypes();
        for (Type type : types) {
            System.out.println(type);
            if (type instanceof ParameterizedType) {
                Type[] types1 = ((ParameterizedType) type).getActualTypeArguments();
                for (Type type1 : types1) {
                    System.out.println("泛型类型:" + type1);
                }
            }
        }
        //获得指定方法返回值泛型信息
        Method method1 = czFxDemo.class.getMethod("test02", null);
        Type typesReturn = method1.getGenericReturnType();
        if (typesReturn instanceof ParameterizedType) {
            Type[] types1 = ((ParameterizedType) typesReturn).getActualTypeArguments();
            for (Type type : types1) {
                System.out.println(type);
            }
        }

    }
}

代码实现操作注解
参考Java注解

每天进步一丢丢
完成

你可能感兴趣的:(Java基础篇,java)